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(:[]=, ...) 的糖,它只是名称奇特的二传手。

您可以使用多个参数定义 setter,但使用它的唯一方法是

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

因为解析器不允许像 A.new.foo = "first", "second" 这样的语法。

于 2012-09-24T13:28:12.240 回答
0

ruby...和是用于构造对象..的字符串文字。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 回答