仅在不是nil时分配变量

Juu*_*uro 9 ruby null variable-assignment

我有@obj.items_per_page,这是20在开始,我希望下面的方法只有在many_items不是nil:

def fetch_it_baby (many_items = nil)
    @obj.items_per_page = many_items
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,即使many_itemsnil,@obj.items_per_page仍然是20.为什么?这是"好"的编码吗?我不应该使用类似的东西

@obj.items_per_page = many_items || @obj.items_per_page
Run Code Online (Sandbox Code Playgroud)

还是有第三种方式?无论哪种方式,我都感到不舒服.

New*_*ria 12

我通常看到的风格如下:

@obj.items_per_page = many_items if many_items
Run Code Online (Sandbox Code Playgroud)

这使用内联条件,同时避免负或双负条件.


Mar*_*eed 10

即使many_items为nil @ obj.items_per_page仍为20

这听起来像任何类@obj都有一个自定义修饰符方法items_per_page=,只有在新值不是时才更新值nil.这不是标准的Ruby.例如,给定这个定义:

class Demo
  attr_accessor :items_per_page
end
Run Code Online (Sandbox Code Playgroud)

我得到这个行为:

irb(main):005:0>     demo = Demo.new           #=> #<Demo:0x007fb7b2060240>
irb(main):006:0>     demo.items_per_page = 20  #=> 20
irb(main):007:0>     demo.items_per_page       #=> 20
irb(main):008:0>     demo.items_per_page = nil #=> nil
irb(main):009:0>     demo.items_per_page       #=> nil
Run Code Online (Sandbox Code Playgroud)

至于你的例子,我可能会这样写:

@obj.items_per_page = many_items unless many_items.nil?
Run Code Online (Sandbox Code Playgroud)


Don*_*ank 9

我建议如下,因为它清楚地表明,如果调用者未many_items在调用中指定,则您具有分配的默认值:

def function(argument = nil)
  variable = argument || 20
  ...
end
Run Code Online (Sandbox Code Playgroud)

但是,由于您指定仅在值不存在时才进行赋值,nil因此您需要检查该nil值,否则如果值为,则将丢失赋值false.如果你确实需要这种情况,那么解决方案就更加冗长:

def function(argument = nil)
  variable = argument.nil? ? 20 : argument
  ...
end
Run Code Online (Sandbox Code Playgroud)


use*_*ser 9

您可以使用&&=(与||=用于仅在nil或false时分配的方式相同)

> a = 20    # => 20 
> a &&= 30  # => 30
> a         # => 30
> a = nil   # => nil
> a &&= 30  # => nil
> a = false # => false
> a &&= 30  # => false
> a = {}    # => {}
> a &&= 30  # => 30
Run Code Online (Sandbox Code Playgroud)

  • 不,它的行为符合预期,如“foobar = foobar &amp;&amp; 3”。问题是我正在回答“仅当 *variable* 不为零时才分配变量”,而问题暗示“仅当 *value* 不为零时才分配变量”。 (2认同)