【问题标题】:Why am I getting objects printed twice?为什么我要打印两次对象?
【发布时间】:2013-01-16 16:42:19
【问题描述】:

当我在 irb 或 rails 中并使用 each 创建一些迭代时,我会在终端或浏览器中再次打印整个结构。示例:

a = [1,2,3,4]

a.each do |number|
  puts n
end

irb终端或浏览器内部的结果:

1
2
3
4

=> [1,2,3,4]

为什么=> [1,2,3,4] 会出现在浏览器中?我无法在我的页面中创建单个列表,因为整个结构都出现了。

【问题讨论】:

    标签: ruby irb


    【解决方案1】:

    Ruby 中的每个表达式都会返回一个值;在irb中,你刚刚执行的表达式返回的值显示在=>之后。

    Enumerable::each 的返回值是调用each 的对象——在本例中为数组[1,2,3,4]

    【讨论】:

    • 谢谢!我该怎么做才能在我的应用程序中不出现这种行为?在浏览器中,我再次看到填充列表和这个孔结构......
    • 猜想,你有类似<%= a.each {|n| puts n} %>的东西。在这种情况下,= 意味着 Rails 将输出表达式的值 - a,如前所述。你最好的选择可能是<%= a.join("\n") %> 或类似的。
    • 谢谢!我现在看到了问题!你们都太聪明了!了解返回行为后,我知道错误来自这个“=”信号。正确的结构必须是 html
    【解决方案2】:

    您会看到它们打印了两次:一次作为副作用,第二次作为返回值。 irb 总是puts 最后一个返回值。 each 的返回值是它的接收者。使用 irb 时无法避免这种情况,但当您将脚本作为独立软件运行时,它们不会出现。第一个1,...,4 是您的puts 的输出。它们被称为副作用。

    【讨论】:

    • 感谢您的回答。现在我需要避免在浏览器内、rails 应用程序内重复打印。我正在使用此迭代来填充列表(
        ),并且我再次获得了正确的列表和整个结构,在列表之后打印......就像在终端中一样。
    【解决方案3】:

    因为 ruby​​ 会在所有内容中返回,甚至是块。所以你的每一条语句都在返回。你看到它的输出是因为 irb 向你展示了一切的回报。在脚本中它只会输出一次。

    【讨论】:

      【解决方案4】:

      irb外面跑一下,你就会豁然开朗。

      ruby -e `[1,2,3,4].each {|ele| puts ele}`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-07
        相关资源
        最近更新 更多