最初は@obj.items_per_page
である20
があり、many_items
がnil
でない場合にのみ、以下のメソッドに値を割り当てたいと思います。
def fetch_it_baby (many_items = nil)
@obj.items_per_page = many_items
上記のコードでは、many_items
がnil
であっても、@obj.items_per_page
は20
のままです。どうして?そして、それは「良い」コーディングですか?私は次のようなものを使うべきではありません
@obj.items_per_page = many_items || @obj.items_per_page
または、3番目の方法はありますか?私はどちらの方法でも完全に快適ではありません。
私が一般的に見るスタイルは次のようになります。
@obj.items_per_page = many_items if many_items
これは、負または二重否定の条件を回避しながら、インライン条件を使用します。
Many_itemsがnilであっても、@ obj.items_per_pageは20のままです。
それはどんなクラスのようにも聞こえます@obj
にはカスタム修飾子メソッドがありますitems_per_page=
新しい値がnil
でない場合にのみ値を更新します。これは標準のRubyではありません。たとえば、次の定義が与えられます。
class Demo
attr_accessor :items_per_page
end
私はこの振る舞いをします:
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
あなたの例として、私はおそらくそれをこのように書くでしょう:
@obj.items_per_page = many_items unless many_items.nil?
&&=
を使用できます(||=
が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
呼び出し元が呼び出しでmany_items
を指定しなかった場合に備えて、割り当てのデフォルト値があることが明確になるため、次のことをお勧めします。
def function(argument = nil)
variable = argument || 20
...
end
ただし、値がnil
でない場合にのみ割り当てが行われるように指定したため、nil
値を確認する必要があります。そうしないと、値がfalse
の場合に割り当てが失われます。 本当にその場合が必要な場合、解決策はより長くなります。
def function(argument = nil)
variable = argument.nil? ? 20 : argument
...
end
私はRailsを使用していますが、同様のニーズがあります。
モデルにメソッドを定義できます。
class Gift < ApplicationRecord
def safe_set(attribute, value)
return if value.nil?
send("#{attribute}=", value)
end
end
だからあなたはすることができます
g = Gift.new
g.colour = 'red'
g.safe_set(:colour, nil)
g.colour -> 'red'
g.safe_set(:colour, 'green')
g.colour -> 'green'
new-alexandria の答えは私の頼みの綱ですが、もう1つの「第3の方法」は ternary を使用することです。
class Demo
attr_accessor :items_per_page
end
many_items = 100
@obj = Demo.new
@obj.items_per_page = 20 #=> 20
@obj.items_per_page = !many_items.nil? ? 30 : nil #=> 30