ruby中的条件链

ruby中的条件链,ruby,Ruby,我已经阅读了,但我无法创建完整的示例: class Some def method_a puts "a" end def method_b puts "b" end def method_c puts "c" end end some = Some.new a = true b = true c = true l = [] l << :method_a if a l

我已经阅读了,但我无法创建完整的示例:

class Some
  def method_a
    puts "a"
  end

  def method_b
    puts "b"
  end

  def method_c
    puts "c"
  end
end

some = Some.new

a = true
b = true
c = true

l = []
l << :method_a if a
l << :method_b if b
l << :method_c if c

l.inject(some) { |obj, method|
  obj.send(method)
}
class一些
定义方法a
放“a”
结束
def方法b
放“b”
结束
def方法c
放“c”
结束
结束
some=some.new
a=正确
b=正确
c=真
l=[]

lInject将块的返回值传递给下一次迭代。现在您的
obj
在第一次迭代后返回值为
obj.send(:method_a)
。按如下方式修复您的注入:

l.inject(some) { |obj, method|
  obj.send(method)
  obj
}

您也可以使用
点击

l.inject(some) do |obj,method|
  obj.tap{|o| o.send(method)}
end
或者,您可以使用tap清除该
l

some.tap{|s|s.method_a if a}.tap{|s|s.method_b if b}.tap{|s|s.method_c if c}

tap是Ruby1.9中的方法外接程序,但我们可以在Ruby1.8中的Rails中使用returning方法。 Rails控制台代码:

>> class Some
>>   def method_a
>>     puts "a"
>>   end
>> 
?>   def method_b
>>     puts "b"
>>   end
>> 
?>   def method_c
>>     puts "c"
>>   end
>> end
=> nil
>> 
?> some = Some.new
=> #<Some:0x2a98c4f938>
>> 
?> a = true
=> true
>> b = true
=> true
>> c = true
=> true
>> 
?> l = []
=> []
>> l << :method_a if a
=> [:method_a]
>> l << :method_b if b
=> [:method_a, :method_b]
>> l << :method_c if c
=> [:method_a, :method_b, :method_c]
>> l.inject(some){|obj, method| returning(obj){|r| r.send method}}
a
b
c
=> #<Some:0x2a98c4f938>
>> 
>给一些学生上课
>>定义方法a
>>放“a”
>>结束
>> 
?>定义方法b
>>放“b”
>>结束
>> 
?>定义方法c
>>放“c”
>>结束
>>结束
=>零
>> 
?>一些=一些新的
=> #
>> 
?>a=真
=>正确
>>b=正确
=>正确
>>c=真
=>正确
>> 
?>l=[]
=> []
>>l[:方法a]
>>l[:方法a,:方法b]
>>l[:方法a,:方法b,:方法c]
>>l.inject(some){| obj,method | returning(obj){| r | r.send method}
A.
B
C
=> #
>>