Дополнение методов ключевым словом `alias` - PullRequest
0 голосов
/ 28 апреля 2018

Прочитав Язык программирования Ruby Я нашел пример использования ключевого слова alias для расширения методов.

def hello                      # A nice simple method
  puts 'Hello world'           # Suppose we want to augment it...
end

alias original_hello hello     # Give the method a backup name

def hello                      # Now we define a new method with the old name
  puts "Your attention please" # That does some stuff
  original_hello               # Then calls the original method
  puts "This has been a test"  # Then does some more stuff
end

Действительно, original hello сохраняет старое поведение даже после того, как метод, на который он ссылался, был переопределен.

Но, на мой взгляд, этот пример вряд ли проясняет реальную пользу этой техники. Не может ли это быть достигнуто традиционным способом (например, путем предоставления блока)? Тогда зачем применять эту идиому? Кто-нибудь может привести пример из реального мира, когда расширение с alias действительно имеет смысл?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Может ли кто-нибудь привести пример из реального мира, когда увеличение с alias действительно имеет смысл?

Не совсем. Сегодня вы бы сделали это (пример взят из ответа @ mudasobwa ):

module WeirdInspectRefinement
  module WeirdInspectExtension
    def inspect
      "I am a string: “#{super}”"
    end
  end

  refine String do
    prepend WeirdInspectExtension
  end
end

using WeirdInspectRefinement

p 'abc'.inspect
#⇒ 'I am a string: “"abc"”'

Но даже до того, как существовали Module#prepend и уточнения , никогда не было причины использовать для этого alias, что оставляет неиспользуемые методы вокруг загрязнения. пространство имен, и Rails отказались от него довольно давно :

class String
  old_inspect = instance_method(:inspect)

  define_method(:inspect) do
    "I am a string: “#{old_inspect.bind(self).()}”"
  end
end

'abc'.inspect
#⇒ 'I am a string: “"abc"”'
0 голосов
/ 28 апреля 2018

Код Rails полон тех. Представьте, что оригинальный hello метод не относится к вашей кодовой базе . Где-то в сторонней библиотеке есть метод do_stuff(stuff), объявленный для класса Stuffer.

Вы хотите, например, отладить этот метод. Вы вновь открываете класс, определяете псевдоним и, вуаля:

class Stuffer
  alias original_do_stuff do_stuff
  def do_stuff(stuff)
    puts stuff.inspect
    original_do_stuff(stuff)
  end
end

Теперь весь код, включая оригинальный сторонний код, о котором вы, возможно, даже не знаете, будет распечатывать параметр, передаваемый каждому отдельному вызову do_stuff.


Пример из жизни (не пытайтесь делать это дома и в школе:)

class String
  alias _inspect inspect
  def inspect
    puts "I am a string: “#{_inspect}”"
  end
end
"abc".inspect
#⇒ I am a string: “"abc"”
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...