web-dev-qa-db-ja.com

nilでない場合にのみ変数を割り当てます

最初は@obj.items_per_pageである20があり、many_itemsnilでない場合にのみ、以下のメソッドに値を割り当てたいと思います。

def fetch_it_baby (many_items = nil)
    @obj.items_per_page = many_items

上記のコードでは、many_itemsnilであっても、@obj.items_per_page20のままです。どうして?そして、それは「良い」コーディングですか?私は次のようなものを使うべきではありません

@obj.items_per_page = many_items || @obj.items_per_page

または、3番目の方法はありますか?私はどちらの方法でも完全に快適ではありません。

9
Juuro

私が一般的に見るスタイルは次のようになります。

@obj.items_per_page = many_items if many_items

これは、負または二重否定の条件を回避しながら、インライン条件を使用します。

11
New Alexandria

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?
10
Mark Reed

&&=を使用できます(||=が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
9
user

呼び出し元が呼び出しでmany_itemsを指定しなかった場合に備えて、割り当てのデフォルト値があることが明確になるため、次のことをお勧めします。

def function(argument = nil)
  variable = argument || 20
  ...
end

ただし、値がnilでない場合にのみ割り当てが行われるように指定したため、nil値を確認する必要があります。そうしないと、値がfalseの場合に割り当てが失われます。 本当にその場合が必要な場合、解決策はより長くなります。

def function(argument = nil)
  variable = argument.nil? ? 20 : argument
  ...
end
9
Don Cruickshank

私は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'
0
Zack Xu

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
0
Escapeit