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
=> #
>>