将yield块的返回值传递给调用方法中的变量

时间:2014-02-10 03:41:45

标签: ruby block yield

所以,我没有在搜索中看到我正在寻找的东西。 这是我的问题。我现在正在学习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:

所以我的问题是这个 - 实际上是否会产生传统意义上的任何回报?我在这里没有收到任何错误,所以我不认为我在语法上做错了什么 - 但my_yield似乎没有返回它应该的样子。 有没有办法将yield的输出捕获到变量? 这只是你永远不会做的事吗?我只是在这里玩代码,但我认为这应该是可以工作的东西 shrugs 无论如何 - 感谢任何回答的人:)

1 个答案:

答案 0 :(得分: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