代码之家  ›  专栏  ›  技术社区  ›  Roger

ruby-alias\u方法问题

  •  0
  • Roger  · 技术社区  · 16 年前

    我有以下代码

    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_方法。我知道还有其他方法可以解决这个问题,但我特别想看看是否可以使用alias_方法解决这个问题。努力学习。

    下面的代码将起作用

    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_方法解决。

    4 回复  |  直到 16 年前
        1
  •  3
  •   EmFi    16 年前

    短版本是alias方法,在这里无法帮助您。

    看起来您正在尝试合并由attr_访问器创建的getter和setter。这不起作用的原因是,在调用alias时,您正在用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
    

    编辑:更正了允许设置为“零”或“假”的方法。

        2
  •  4
  •   Geo    16 年前

    我真的不明白你想做什么。通过写作 attr_acccessor :name 这个 name= 方法将自动创建。如果你想让这一切顺利进行:

    user.name("john")
    

    您可以添加此方法:

    class User
       attr_accessor :name
       def name(n)
         self.name = n
       end
    end
    
        3
  •  3
  •   The Who    16 年前

    如果要使用单个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
    
        4
  •  1
  •   Rob Cameron    16 年前
    class User
      attr_accessor :name
    end
    
    u = User.new
    u.name = 'john'
    u.name('john')
    

    u.name 会是你的灵感源泉吗 name . 看起来你想把它叫做二传手?那是你想要做的吗?如果是这种情况,那么您就不会使用attr_访问器,您需要自己编写getter和setter。

    推荐文章