1

単一責任の原則を適用して、太ったモデルをスリム化しようとしています。多くの一般的なコードをミックスインに抽出し、それらを複数のクラスに含めています。しかし、ローカル変数が mixin を含むクラスのメソッド名 (または attr_accessors) と衝突するという奇妙な問題に直面しています。例えば:

module MyAwesomeMixin
  def update_total
    my_total = self.pricing_items.reduce(0) {|sum, x| sum + x} # this borks if the "host class" has a method called my_total=
    total = my_total
  end
end

上記のコード スニペットは、「ホスト クラス」に「変数が完全にメソッドのスコープ内にあり、その周囲の環境とはまったく関係がないmy_total=ことを確認するにはどうすればよいですか? 」というメソッドがある場合、完全に意図しない結果をもたらします。my_totalupdate_total

4

2 に答える 2

8

ローカル変数とメソッドの解釈の間にあいまいさが存在する場合は常に、ローカル変数として解釈されます。

ただし、ローカル変数はメソッド定義を超えて使用できないため、「ホストクラス」での名前のクラッシュについて心配する必要はありません。のメソッド定義内でのみ心配する必要がありますupdate_total。また、定義で一定量のローカル変数を使用しているため、どのローカル変数を処理するかを知ることができるはずです。

1.ローカル変数とセッターメソッドのあいまいさ

あなたがこれを持っているなら:

variable_name =

その後、常にローカル変数の割り当てとして解釈されます。メソッドを参照する場合はvariable_name=、明白なレシーバーおよび/または次のいずれかのような括弧のペアを使用して、ローカル変数からメソッドを明確にする必要があります。

self.variable_name = foo
variable_name=(foo)
self.variable_name=(foo)

2.ローカル変数とゲッターメソッドのあいまいさ

あなたが持っている場合:

variable_name

スコープにそのようなローカル変数がない場合は、メソッド呼び出しとして解釈されます。スコープ内にそのようなローカル変数がある場合、それはローカル変数として解釈されます。このような条件下でメソッドを呼び出したい場合も、明示的なレシーバーや次のいずれかのような括弧のペアを使用して、ローカル変数からメソッドを明確にする必要があります。

self.variable_name
variable_name()
self.variable_name()
于 2012-12-27T13:46:33.097 に答える