ruby alias_method问题

时间:2009-10-27 17:04:53

标签: ruby

我有以下代码

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修复此问题。

4 个答案:

答案 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。