Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不应该';这两个Ruby代码段的工作方式不一样吗?_Ruby - Fatal编程技术网

不应该';这两个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 ## &

在进入Ruby的过程中,我开始玩弄Ruby返回您提到的最后一个东西的方式,即使它不是在
返回
构造之后。但是,为什么这两个代码段的工作方式不相同呢

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