使用参数定义`... =`类型方法

时间:2012-09-24 08:33:22

标签: ruby

可以用... =格式定义一个方法,如下所示:

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

这是一个例外吗?

2 个答案:

答案 0 :(得分:2)

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

是语法错误,所以肯定不会(这也没有意义;)

[]只是.send(:[] =,...)的糖,它只是用精美的名字设置的。

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

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

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

答案 1 :(得分:0)

ruby​​ .....是用于构造Range个对象的字符串文字。您可以通过Range个对象使对象可用。

请参阅http://www.ruby-doc.org/core-1.9.3/Range.html

的第一章

EDITED

foo.rb

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

$ ruby​​ foo.rb

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

BUT!您可以使用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