【问题标题】:Ruby: return vs puts红宝石:回报与看跌
【发布时间】:2016-07-17 07:33:48
【问题描述】:

我有以下两种使用returnputs的方法。

方法一:

def method array
    array.each do |n|
      v = n * n
      return n if v.even?
    end
end

puts method [1, 2, 3, 4] #=> 2

方法二:

def method array
    array.each do |n|
      v = n * n
      puts n if v.even?
    end
end

method [1, 2, 3, 4] #=> 2, 4

是什么让第一个方法返回第一个满足条件的项目 (2),而不是返回第二个 (4)?

【问题讨论】:

  • 不是一个理想的例子,因为v 是偶数,当且仅当n 是偶数。 :-)
  • puts 不返回任何内容。它将东西放入 STDOUT
  • 方法 1 返回2。方法 2 打印2,然后打印4,并返回nil。您混淆了打印的内容和返回的内容。
  • return 也破坏了 each 和方法 method 的整个迭代,这就是它总共产生 2 的原因。在 (2) 中,如果是偶数则执行 puts,但它不会中断迭代。我建议您阅读有关关键字 returnnextcontinuebreak 的内容,以了解 ruby​​ 的概念,尤其是与块有关的内容。
  • @JanDvorak 我很确定每个 Ruby 表达式都会返回一些东西。 puts 返回零。

标签: ruby return


【解决方案1】:

您在第一个方法中使用了return 语句,以便在v.even? 条件为真时退出循环。这就是为什么它只返回2

在第二种方法中,您的循环将检查每个元素,并在v.even? 条件为true 时返回所有元素。

【讨论】:

  • 如果我在这里错了,请纠正我。引用上述 cmets 之一,如果条件为真,RETURN 将中断迭代,而 PUTS 不会。对吗?
  • 是的。如果条件是,RETURN 将中断迭代,而 put 不会
  • @iswg: return 将从方法返回。它也破坏了迭代的事实是它的副作用。
【解决方案2】:

这里不需要新方法

[1, 2, 3, 4].select{|e|e.even?}

已经做了你想做的,并且可以与其他方法链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多