如何在红宝石中使用if-else?

时间:2010-09-16 12:02:19

标签: ruby

我想在一行中使用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

3 个答案:

答案 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)

这里有两个错误。

  1. 小心操作员优先级。如果您不确定,请使用括号
  2. 如果您未在块外定义sum,则sum将不会在博客之外保留其值。
  3. 这是代码

    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)

你得到一个问题,因为总和已定义,但在某些时候会变为零,你无法测试它的定义?没有?在同一行,因为没有?测试将落在它没有定义的事实上。

所以我认为你的问题无法解决。

相关问题