可以以... =
如下格式定义方法:
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
这是特例吗?
可以以... =
如下格式定义方法:
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
这是特例吗?
A.new.f(a, b, c) = 5
是语法错误,所以肯定不是(这也没有意义;)
[]
只是 .send(:[]=, ...) 的糖,它只是名称奇特的二传手。
您可以使用多个参数定义 setter,但使用它的唯一方法是
A.new.send(:f=, "first", "second")
因为解析器不允许像 A.new.foo = "first", "second" 这样的语法。
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