0

私はオープンソースへの貢献を試みていましたが、以下の star_rating メソッドのコード行options.merge()(これは私が提出しようとした変更です) が次のメッセージでキックバックされました。および 1.9.3)..." 私の質問はなぜですか? Hash#mergeRubyインタラクティブシェルでメソッドを確認したところ、うまくいくようです。

def star_rating(options = {})
   ##original line of code
   has_many :rates_without_dimension, :as => :rateable, :class_name => 'RateMe', :dependent => :destroy, :conditions => {:dimension => nil}  

  ##line of code I tried to submit
  has_many :rates_without_dimension, :as => :rateable, options.merge(:class_name => 'RateMe'), :dependent => :destroy, :conditions => {:dimension => nil}  
end
4

3 に答える 3

2

「The Ruby Programming Language」初版の6.4.4章によると

Ruby では、ハッシュ リテラルがメソッドの最後の引数である場合 (または、それに続く唯一の引数がブロック引数であり、前に & が付いている場合)、ハッシュ リテラルを囲む中括弧を省略できます。

method a => b, c => d, {e => f, g => h}, i => jhash.merge はハッシュを返すため、メソッド呼び出しの形式はです。したがって、単一のハッシュを入れるのではなく、ハッシュを分割しているため、コンパイラはそれa => b, c=>dが 1 つのハッシュであると想定し、最後の引数ではなく、最後の引数のルールを破っています。

また、同項によると、

括弧を省略する場合は、中括弧を省略する必要があります。

あなたの hash.merge は中かっこで囲まれたハッシュを返しますが、これはそのルールを破っています。

編集:ハッシュが唯一の引数でない限り、これは実際には問題ありません。

于 2012-07-04T04:04:52.603 に答える
1

options一般に、Rubyメソッドへの受け渡しは、通常、それを最後のパラメーターにすることによって行われます。場合によっては、実際には最後のパラメーターである必要があります。

于 2012-07-04T02:49:08.230 に答える
1

これは確かに無効な構文です。メソッド呼び出しの最後の引数はハッシュにすることができます。その場合、Ruby では囲んでいる を削除できます{}

foo(1, 2, 3, :a => 4, :b => 5)
# equivalent to:
foo(1, 2, 3, {:a => 4, :b => 5})

あなたの場合、:as => :rateable単純な引数 ( options.merge) の前にあり、それは許可されていません。

それらを反転した場合でも、必要な効果は得られません。

has_many :rates_without_dimension, options.merge(:class_name => 'RateMe'), :as => :rateable, :dependent => :destroy, :conditions => {:dimension => nil}
# same as
has_many :rates_without_dimension, options.merge(:class_name => 'RateMe'), {:as => :rateable, :dependent => :destroy, :conditions => {:dimension => nil}}
# => has 3 arguments, not 2.

ここでできることは、2 つのパラメーターを渡すことを保証することです。これを行う1つの方法:

has_many :rates_without_dimension, options.merge(:class_name => 'RateMe', :as => :rateable, :dependent => :destroy, :conditions => {:dimension => nil})

Ruby 2.0 では、配列のスプラット演算子 ( ) と等価のハッシュ演算子を使用して、必要なことを実行できることに注意してください。***

h = {:b => 2}
foo(:a => 1, **h, :c => 3)
# same as
foo(:a => 1, :b => 2, :c => 3) 

# so you will be allowed to write:
has_many :rates_without_dimension, :as => :rateable, **options.merge(:class_name => 'RateMe'), :dependent => :destroy, :conditions => {:dimension => nil}
于 2012-07-04T04:04:50.830 に答える