任何人都可以帮我弄清楚Ruby中yield和return的用法。我是一名Ruby初学者,非常感谢这些简单的例子。
提前谢谢!
答案 0 :(得分:29)
return语句的工作方式与它在其他类似编程语言上的工作方式相同,只是从它使用的方法返回。 您可以跳过要返回的调用,因为ruby中的所有方法始终返回最后一个语句。所以你可能会找到这样的方法:
def method
"hey there"
end
这实际上与做类似的事情相同:
def method
return "hey there"
end
另一方面,{p> yield
会将作为参数给出的块作为方法。所以你可以有这样的方法:
def method
puts "do somthing..."
yield
end
然后像这样使用它:
method do
puts "doing something"
end
结果是,将在屏幕上打印以下两行:
"do somthing..."
"doing something"
希望能稍微清理一下。有关块的更多信息,您可以查看this link。
答案 1 :(得分:6)
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
的示例,我将用它来实现一个方法,以查看数字是否为happy:
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 ...
希望这有帮助! :)
答案 2 :(得分:0)
def cool
return yield
end
p cool {"yes!"}
yield关键字指示Ruby执行块中的代码。在此示例中,块返回字符串"yes!"
。在cool()
方法中使用了显式返回语句,但这也可能是隐含的。