不应该';这两个Ruby代码段的工作方式不一样吗?
在进入Ruby的过程中,我开始玩弄Ruby返回您提到的最后一个东西的方式,即使它不是在不应该';这两个Ruby代码段的工作方式不一样吗?,ruby,Ruby,在进入Ruby的过程中,我开始玩弄Ruby返回您提到的最后一个东西的方式,即使它不是在返回构造之后。但是,为什么这两个代码段的工作方式不相同呢 module Enumerable def palindrome? reversed_self = self.reverse self.each_with_index {|el,index| unless self[index]==reversed_self[index] return false ## &
返回
构造之后。但是,为什么这两个代码段的工作方式不相同呢
module Enumerable
def palindrome?
reversed_self = self.reverse
self.each_with_index {|el,index|
unless self[index]==reversed_self[index]
return false ## <-----
end
}
true
end
end
模块可枚举
def回文?
反向的
self.each_与_索引{el,索引|
除非自[索引]==反向自[索引]
return false##如果不存在return
语句,则函数的返回值是最后一个计算值。在第二次截断中,最后一个值总是true
第一个代码段以false
提前返回。第二个代码段对false
不做任何处理,它被丢弃。不完全如此!从块内部返回的与在lambda内部返回的不同,如中所述。当从块内部返回时,就是从整个方法返回她不只是一个街区
我们可以这样说明:
return :foo # => LocalJumpError: unexpected return
[1, 2, 3].map { return :foo } # => LocalJumpError: unexpected return
[1, 2, 3].map { :foo } # => [:foo, :foo, :foo]
通常情况下,lambdas不会发生这种情况:
l = lambda { return :foo }
l.call # => :foo
[1, 2, 3].map { l.call } # => [:foo, :foo, :foo]
但是,当我们尝试将lambda作为块传递给方法时,行为会发生变化:
[1, 2, 3].map &l # => LocalJumpError: unexpected return
Ruby将返回方法中最后一个执行的表达式的值。第二个版本中的false
不是最后一个表达式,没有任何命令Ruby在该点停止执行,因此它将一直执行到方法结束
return
是一种显式地告诉Ruby停止执行并返回值的方法。它不会放弃它:假设条件满足,除非..end
块将计算为其内部的false
。关键是return
语句将从整个方法返回。@jtbandes:and然后,的值,除非被丢弃:)好吧,它被每个丢弃,但不是被语言的属性丢弃。@jtbandes:同意,我本可以用更好的措辞。那么你的意思是,当一个块中有一个return
子句时,我们只从该块返回?我想你对你的答案感到困惑了?不,是这样的正好相反。从块内部返回试图从封闭方法返回。我编辑了我的第二句来澄清。
[1, 2, 3].map &l # => LocalJumpError: unexpected return