class Foo
attr_accessor :x, :y
def xx(a)
@x = a
end
def yy(b)
@y = b
end
def foo(a, b)
xx a
yy b
end
def xx=(a)
@x = a
end
def yy=(b)
@y = b
end
def foo_assign(a, b)
xx=(a)
yy=(b)
end
def foo=(a, b)
foo_assign a, b
end
def inspect
"#<Foo:@x=#@x,@y=#@y>"
end
end
f = Foo.new
f.foo_assign 1, 2
p f
# => #<Foo:@x=,@y=>
f.foo 1, 2
p f
# => #<Foo:@x=1,@y=2>
f.foo=(1, 2) # SyntaxError
f.foo= 1, 2 # ArgumentError
在 Foo#foo_assign中貌似xx和yy被当成新定义的局部变量。是不是只能通过self.xx=这样的显式调用才行?哪位明白人给讲讲Ruby对 =
的特殊处理。
写这个的时候发现 foo_assign 不能定义成 foo=
,要不然 f.foo=(1, 2)
抛出异常,而且有括号和没括号还不一样。