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_items是nil,@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)
我建议如下,因为它清楚地表明,如果调用者未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)
您可以使用&&=(与||=用于仅在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)