2

... =次のような形式でメソッドを定義することができます。

class A
  def f= x
    puts x
  end
end

A.new.f = 5

しかし、次のように使用できるように、引数を使用してこの形式でメソッドを定義することは可能ですか?

A.new.f(a, b, c) = 5

編集

あなたはこれを行うことができます[]=

class A
  def []= x, y, z
    puts x, y, z
  end
end

A.new[1, 2] = 3

これは例外的なケースですか?

4

2 に答える 2

2
A.new.f(a, b, c) = 5

構文エラーなので、そうではありません(これも意味がありません;)

[].send(:[]=, ...) の単なるシュガーであり、派手な名前のセッターです。

複数の引数でセッターを定義できますが、それを使用する唯一の方法は

A.new.send(:f=, "first", "second")

パーサーが A.new.foo = "first", "second" のような構文を許可しないためです。

于 2012-09-24T13:28:12.240 に答える
0

ルビ...とは、オブジェクト..を構築するための文字列リテラルです。Rangeオブジェクトをオブジェクトで使用できるようにすることができRangeます。

http://www.ruby-doc.org/core-1.9.3/Range.htmlの最初の章を参照してください。

編集済み

foo.rb

class A
  def ...(a)
    p a
  end
end

$ ルビー foo.rb

foo.rb:2: syntax error, unexpected tDOT3
  def ...(a)
         ^
foo.rb:5: syntax error, unexpected keyword_end, expecting $end

しかし!define_method を使用して呼び出されるメソッドを定義でき...ますが、それは経由でしか呼び出すことができないsendため、まったく役に立ちません。

$ irb
1.9.3p194 :001 > class A; end
 => nil 
1.9.3p194 :002 > A.send(:define_method, :'...') { puts 'hello' }
 => #<Proc:0x007fe1931dbb50@(irb):2 (lambda)> 
1.9.3p194 :003 > A.new.send(:'...')
hello
 => nil 
于 2012-09-24T13:34:32.917 に答える