Ruby alias alias_method путаница - PullRequest
       2

Ruby alias alias_method путаница

0 голосов
/ 02 января 2019

У меня есть этот кусок кода здесь:

class MyFile
  attr_accessor :byte_content

  alias_method :read,  :byte_content
  alias_method :write, :byte_content=
end

В классе MyFile есть alias_method, но я не понимаю, как работает этот метод.Меняет ли он способ получения и установки для :byte_content?

Кроме того, в чем разница между этим методом и просто использованием alias?Когда я должен один над другим?

Заранее спасибо за ваше время!

1 Ответ

0 голосов
/ 02 января 2019

This:

attr_accessor :byte_content

По существу делает:

def byte_content
  @byte_content
end 

def byte_content=(value)
  @byte_content = value
end

Затем

alias_method :read, :byte_content
alias_method :write, :byte_content=

создаст копии методов byte_content и byte_content= сread и write как новые имена.Если вы измените методы byte_content или byte_content= после алиасинга, read и write останутся без изменений.

Таким образом, намерение alias_method в этом примере выглядит так:дать пользователю более "File -подобный" интерфейс.Без псевдонимов методов вы бы использовали:

file = MyFile.new
file.byte_content = "abcd"
puts file.byte_content

С псевдонимами пользователь может использовать:

file = MyFile.new
file.write("abcd")
file.read

, что очень похоже на методы стандартной библиотеки Fileclass,

file = File.open('/tmp/foo.txt', 'w')
file.write('hello')
file.rewind
puts file.read

И это позволяет использовать экземпляры MyFile вместо реальных File экземпляров в некоторых очень простых случаях использования, также известных как Duck-typing .

alias против alias_method

Различия alias и alias_method описаны в ответах на на этот вопрос , наиболее важно:

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