我想在一行中使用if-else条件。我使用了三元运算符,但似乎没有用。有线索吗?
class Array
def painful_injection
each do |item|
sum = yield (defined?(sum).nil?) ? 0 : sum, item #pass the arguments to the block
end
sum
end
end
puts [1, 2, 3, 4].painful_injection {|sum, nxt_item| sum + nxt_item}
这给了我一个错误:
Error :undefined method `+' for false:FalseClass
答案 0 :(得分:3)
这里有几个问题。一个是某个变量的defined?
在该变量的赋值中不返回nil
,例如。
irb(main):012:0> some_new_var = defined?(some_new_var)
=> "local-variable"
由于运算符优先级,您还需要一些额外的括号。
最后,块内定义的变量仅在对块的调用中可用,因此当each
生成后续项时,sum
的先前值将丢失。
为什么不将sum
设置为0
之外的each
,例如
class Array
def painful_injection
sum = 0
each do |item|
sum = yield(sum, item) #pass the arguments to the block
end
sum
end
end
...但是也可以只使用普通的inject
[1,2,3,4].inject(0) { |sum, item| sum + item }
所以也许您需要澄清一下您要解决的问题?
答案 1 :(得分:0)
这里有两个错误。
sum
,则sum
将不会在博客之外保留其值。这是代码
class Array
def painful_injection
sum = 0
each do |item|
sum = yield((sum.zero? ? 0 : sum), item) # pass the arguments to the block
end
sum
end
end
puts [1, 2, 3, 4].painful_injection {|sum, nxt_item| sum + nxt_item}
答案 2 :(得分:0)
我认为这是对这个具体案例的解释。
class Array
def painful_injection
sum = 0
each do |item|
sum = yield(sum,item)
end
sum
end
end
puts [1, 2, 3, 4].painful_injection {|sum, nxt_item| sum + nxt_item}
我希望这是你想要实现的目标,如果出于以下原因,我没有得到内联:
如果你这样使用它:
sum = yield((defined?(sum) ? sum : sum = 0),item)
你得到一个问题,因为总和已定义,但在某些时候会变为零,你无法测试它的定义?没有?在同一行,因为没有?测试将落在它没有定义的事实上。
所以我认为你的问题无法解决。