19

谁能帮我弄清楚在Ruby中使用yield和return。我是一名 Ruby 初学者,因此非常感谢简单的示例。

先感谢您!

4

3 回答 3

38

return 语句的工作方式与其他类似编程语言的工作方式相同,它只是从使用它的方法返回。您可以跳过对 return 的调用,因为 ruby​​ 中的所有方法总是返回最后一条语句。所以你可能会找到这样的方法:

def method
  "hey there"
end

这实际上与执行以下操作相同:

def method
  return "hey there"
end

yield另一方面,执行作为方法参数给出的块。所以你可以有这样的方法:

def method 
  puts "do somthing..."
  yield
end

然后像这样使用它:

method do
   puts "doing something"
end

结果,将在屏幕上打印以下 2 行:

"do somthing..."
"doing something"

希望这能澄清一点。有关块的更多信息,您可以查看此链接

于 2012-05-04T14:54:40.670 回答
8

yield用于调用与方法关联的块。您可以通过在方法及其参数之后放置块(基本上只是花括号中的代码)来做到这一点,如下所示:

[1, 2, 3].each {|elem| puts elem}

return从当前方法退出,并使用其“参数”作为返回值,如下所示:

def hello
  return :hello if some_test
  puts "If it some_test returns false, then this message will be printed."
end

但请注意,您不必任何方法中使用 return 关键字;如果没有返回值,Ruby 将返回最后评估的语句。因此这两个是等价的:

def explicit_return
  # ...
  return true
end

def implicit_return
  # ...
  true
end

这是一个示例yield

# A simple iterator that operates on an array
def each_in(ary)
  i = 0
  until i >= ary.size
    # Calls the block associated with this method and sends the arguments as block parameters.
    # Automatically raises LocalJumpError if there is no block, so to make it safe, you can use block_given?
    yield(ary[i])
    i += 1
  end
end

# Reverses an array
result = []     # This block is "tied" to the method
                #                            | | |
                #                            v v v
each_in([:duck, :duck, :duck, :GOOSE]) {|elem| result.insert(0, elem)}
result # => [:GOOSE, :duck, :duck, :duck]

还有一个例子return,我将用它来实现一个方法来查看一个数字是否快乐

class Numeric
  # Not the real meat of the program
  def sum_of_squares
    (to_s.split("").collect {|s| s.to_i ** 2}).inject(0) {|sum, i| sum + i}
  end

  def happy?(cache=[])
    # If the number reaches 1, then it is happy.
    return true if self == 1
    # Can't be happy because we're starting to loop
    return false if cache.include?(self)
    # Ask the next number if it's happy, with self added to the list of seen numbers
    # You don't actually need the return (it works without it); I just add it for symmetry
    return sum_of_squares.happy?(cache << self)
  end
end

24.happy? # => false
19.happy? # => true
2.happy?  # => false
1.happy?  # => true
# ... and so on ...

希望这可以帮助!:)

于 2012-05-04T14:50:40.050 回答
1
def cool
  return yield
end

p cool {"yes!"}

yield 关键字指示 Ruby 执行块中的代码。在此示例中,块返回字符串"yes!"。该方法中使用了显式的 return 语句cool(),但这也可能是隐式的。

于 2017-05-13T10:35:08.633 回答