2017-08-16 4 views
2

は、だから私はTraiblazerと改革のドキュメントの上にしてきたと私は多くの場合、この種のコードこのコード例でdouble splat(**)引数は何を意味し、なぜそれを使用するのですか?

class AlbumForm < Reform::Form 
    collection :songs, populate_if_empty: :populate_songs! do 
    property :name 
    end 

    def populate_songs!(fragment:, **) 
    Song.find_by(name: fragment["name"]) or Song.new 
    end 
end 

お知らせdef populate_songs!(fragment:, **)定義を参照してください?

他のすべてのキーワード引数を取り込むdouble splatという名前の引数(**othersなど)をよく知っています。しかし、私は一度も**を名前なしで見たことはありません。

だから私の2つの質問は以下のとおりです。

  1. **上記のブロックに何を意味するのでしょうか?
  2. なぜこの構文を使用しますか?

答えて

7

**上記ブロックの意味は?

これはkwsplatですが、名前は割り当てられていません。したがって、このメソッドはキーワード引数の任意のセットを受け入れ、:fragment以外のすべてを無視します。

なぜこの構文を使用しますか?あなたに興味を持っていないなら、引数を無視する


少しデモ

class Person 
    attr_reader :name, :age 

    def initialize(name:, age:) 
    @name = name 
    @age = age 
    end 

    def description 
    "name: #{name}, age: #{age}" 
    end 
end 

class Rapper < Person 
    def initialize(name:, **) 
    name = "Lil #{name}" # amend one argument 
    super # send name and the rest (however many there are) to super 
    end 
end 

Person.new(name: 'John', age: 25).description # => "name: John, age: 25" 
Rapper.new(name: 'John', age: 25).description # => "name: Lil John, age: 25" 
+2

同じパターンでも、通常の引数のために働きます。 1つのスプラットパラメータは任意の引数を受け入れますが、それらを変数に代入しません。 –

+1

@HolgerJust:はい、もちろん、言及に感謝します。 –

関連する問題