【问题标题】:Shouldn't these two Ruby snippets work the same way?这两个 Ruby 片段不应该以相同的方式工作吗?
【发布时间】:2012-03-11 13:28:39
【问题描述】:

在尝试使用 Ruby 时,我开始玩弄诸如 Ruby 返回您提到的最后一件事的方式,即使它不是在 return 构造之后。但是,为什么这两个 sn-ps 的工作方式不同不应该吗?

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

到目前为止一切顺利: puts ['foo','bar','baz'].palindrome?打印“假”

module Enumerable
  def palindrome?
    reversed_self = self.reverse
    self.each_with_index {|el,index|
      unless self[index]==reversed_self[index]
        false ## <------
      end
    }
    true
  end
end

把 ['foo','bar','baz'].palindrome?出于某种原因打印“真”

这背后的科学原理是什么?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    Ruby 将返回方法中最后执行的表达式的值。第二个版本中的 false 不是最后一个表达式,没有什么告诉 Ruby 在那个时候停止执行,所以它会一直运行直到方法结束。

    return 是一种明确告诉 Ruby 停止执行并返回值的方式。

    【讨论】:

      【解决方案2】:

      不完全是!块内部的return 与 lambda 内部的return 不同,如my answer here 中所述。当您从块内部return 时,您将返回整个方法而不仅仅是块。

      我们可以这样说明:

      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
      

      【讨论】:

      • 所以你的意思是当块中有return 子句时,我们只从块中返回?我想你的答案很困惑?
      • 不,恰恰相反。块内部的返回尝试从封闭方法返回。我编辑了我的第二句话来澄清。
      【解决方案3】:

      如果不存在return 语句,则函数的返回值是最后评估的值。在第二个片段中,最后一个值始终是true

      第一个 sn-p 提前返回 false。 Second 对 false 没有任何作用,它被丢弃了。

      【讨论】:

      • 它不会丢弃它:假设满足条件,unless..end 块将评估为其中的false。关键是return 语句将从整个方法中返回。
      • @jtbandes: 然后 unless 的值被丢弃:)
      • 好吧,它被each 丢弃,但不是被语言的属性丢弃。
      • @jtbandes:同意,我可以使用更好的措辞。
      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 2011-08-20
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      相关资源
      最近更新 更多