我有以下代码
class User
attr_accessor :name
end
u = User.new
u.name = 'john'
puts u.name #=> john
在上述情况下一切正常。但是这段代码不起作用
class User
attr_accessor :name
end
u = User.new
u.name = 'john'
u.name('john')
为了解决这个问题,我决定使用alias_method。我知道还有其他方法可以解决这个问题,但我特别想知道是否可以使用alias_method来解决这个问题。试着学习。
以下代码可以使用
class User
attr_accessor :name
alias_method :foo, :name=
end
u = User.new
u.foo('john')
puts u.name
然而,这段代码不会有明显的原因。
class User
attr_accessor :name
alias_method :name, :name=
end
u = User.new
u.name('john')
puts u.name
任何人都知道是否可以使用alias_method修复此问题。
答案 0 :(得分:4)
我真的没有得到你想做的事。通过编写attr_acccessor :name
,可以自动创建name=
方法。如果您正在尝试这项工作:
user.name("john")
您可以添加此方法:
class User
attr_accessor :name
def name(n)
self.name = n
end
end
答案 1 :(得分:3)
短版本是别名方法,在这里帮不了你。
看起来你正在尝试合并由attr_accessor创建的getter和setter。这不起作用的原因是因为你在调用别名时用setter覆盖getter。
要获得您正在寻找的功能,您必须定义自己的方法。
这样的事情:
class User
attr_accessor :name
def name(set_value = "VALUE_THAT_WILL_NEVER_BE_USED_AS_A_NAME")
unless set_value == "VALUE_THAT_WILL_NEVER_BE_USED_AS_A_NAME"
@name = set_value
end
@name
end
end
u = User.new
u.name('john') #=> sets name to john
puts u.name #=> puts john
# bonus! doesn't override name=
u.name = 'mike' # => sets name to mike
puts u.name #=> puts mike
编辑:修正了允许设置为nil或false的方法。
答案 2 :(得分:3)
如果您想使用单个getter / setter方法,请注意使用“nil”,因为您可能希望将属性设置为nil。
u.name("john")
u.name(nil) # name still will be john
所以做一些检查有args的事情
class U
attr_reader :n
def n(*args)
if(args.length > 0)
@n = args.first
else
@n
end
end
end
u = U.new
u.n "j"
u.n # j
u.n nil
u.n # nil
答案 3 :(得分:1)
class User
attr_accessor :name
end
u = User.new
u.name = 'john'
u.name('john')
在此代码中,u.name
将成为name
的获取者。看起来你正试图把它称为制定者?这是你想要的吗?如果是这种情况,那么你就不会使用attr_accessor,你需要自己编写getter和setter。