【问题标题】:Passing the return from a yield block to a variable in the calling method将收益块的返回值传递给调用方法中的变量
【发布时间】:2014-03-07 06:49:16
【问题描述】:

所以,我没有看到我在搜索中寻找的确切内容。 这是我的问题。我现在正在学习 Ruby 和 RoR - 我有一个问题我似乎找不到答案。 所以,这是我的播放代码:

class BlocksAndIterators
  def yield_madness(a, b)
    my_funky_pi = ((a*b) - (b+a)) / 3.14
    my_yield = yield(my_funky_pi, a)
    "my_funky_pi: #{my_funky_pi}\nmy_yield: #{my_yield}"
  end
end

bi = BlocksAndIterators.new
puts bi.yield_madness(12, 24){|x, y| puts "x: #{x} and y: #{y}"}

现在,我得到的输出如下:

dkm@dkm-MasterControl:~/Projects/ruby_playground$ ruby blocks_iterators.rb 
x: 80.2547770700637 and y: 12
my funky pi: 80.2547770700637
my yield:

所以我的问题是 - yield 实际上不会返回传统意义上的任何东西吗?我在这里没有收到任何错误,所以我认为我没有做任何语法不正确的事情 - 但 my_yield 似乎并没有返回它应该返回的内容。 有没有办法将产量的输出捕获到变量? 这只是你永远不会做的事情吗?我只是在这里玩代码,但我认为这应该是可行的耸耸肩 无论如何-感谢任何回答的人:)

【问题讨论】:

    标签: ruby block yield


    【解决方案1】:

    您遇到的问题是您的块返回puts 的结果,即nil,并且在一个字符串中最终是一个空字符串。使用不同的块,例如这个,你会得到不同的结果:

    puts bi.yield_madness(12, 24) { |x, y|
      puts "x: #{x} and y: #{y}"
      32
    }
    
    x: 80.2547770700637 and y: 12
    my_funky_pi: 80.2547770700637
    my_yield: 32
    => nil
    

    【讨论】:

    • 哦哦。好的,我明白了。所以,这就是为什么在 irb 中 - 类似: puts "hello" 将打印 "hello" 后跟一行: => nil ... 对吗?这就说得通了。谢谢:)
    • 正确。 IRB 显示将打印到标准输出 (hello) 的内容和 puts always returns nil 的计算结果:)
    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 2010-11-03
    • 2011-11-13
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多