ruby alias_method question - PullRequest
       5

ruby alias_method question

0 голосов
/ 27 октября 2009

У меня следующий код

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 ]

4 голосов
/ 27 октября 2009

Я не совсем понимаю, что вы пытаетесь сделать. При записи attr_acccessor :name метод name= создается автоматически. Если вы пытаетесь сделать эту работу:

user.name("john")

Вы можете добавить этот метод:

class User
   attr_accessor :name
   def name(n)
     self.name = n
   end
end
3 голосов
/ 27 октября 2009

Если вы хотите использовать один метод получения / установки, остерегайтесь использования "nil", так как вы можете установить свой атрибут на nil.



u.name("john")
u.name(nil) # name still will be john

Так что сделайте что-нибудь, что проверяет наличие аргументов


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 голосов
/ 27 октября 2009

Краткая версия - метод псевдонимов, здесь вам не поможет.

Похоже, вы пытаетесь объединить метод получения и установки, созданный attr_accessor. Причина, по которой это не работает, заключается в том, что вы переопределяете метод получения с помощью метода установки, когда вызываете псевдоним.

Чтобы получить требуемую функциональность, вам нужно определить свой собственный метод.

Примерно так:

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

Редактировать: Исправлен метод, позволяющий установить ноль или ложь.

1 голос
/ 27 октября 2009
class User
  attr_accessor :name
end

u = User.new
u.name = 'john'
u.name('john')

В этом коде u.name будет получателем для name. Похоже, вы пытаетесь назвать это сеттером? Это то, что вы хотите сделать? Если это так, то вы не будете использовать attr_accessor, вам придется написать геттеры и сеттеры самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...