Я знаю, что могу сделать следующее, и это всего лишь 3 строки:
class << self
alias :generate :new
end
Но из любопытства существует более простой способ (без точек с запятой):
class_alias :generate, :new
Я знаю, что могу сделать следующее, и это всего лишь 3 строки:
class << self
alias :generate :new
end
Но из любопытства существует более простой способ (без точек с запятой):
class_alias :generate, :new
С Ruby 1.9 вы можете использовать метод singleton_class
для доступа к одноэлементному объекту класса. Таким образом, вы также можете получить доступ к методу alias_method
. Сам метод является приватным, поэтому вам нужно вызвать его с помощью send
. Вот ваш один лайнер:
singleton_class.send(:alias_method, :generate, :new)
Имейте в виду, что alias
здесь не работает.
Я вставляю некоторые примеры методов псевдонима
class Test
def simple_method
puts "I am inside 'simple_method' method"
end
def parameter_instance_method(param1)
puts param1
end
def self.class_simple_method
puts "I am inside 'class_simple_method'"
end
def self.parameter_class_method(arg)
puts arg
end
alias_method :simple_method_new, :simple_method
alias_method :parameter_instance_method_new, :parameter_instance_method
singleton_class.send(:alias_method, :class_simple_method_new, :class_simple_method)
singleton_class.send(:alias_method, :parameter_class_method_new, :parameter_class_method)
end
Test.new.simple_method_new
Test.new.parameter_instance_method_new("I am parameter_instance_method")
Test.class_simple_method_new
Test.parameter_class_method_new(" I am parameter_class_method")
ВЫХОД
I am inside 'simple_method' method
I am parameter_instance_method
I am inside 'class_simple_method'
I am parameter_class_method
Я не верю, что существует какая-то версия класса alias
. Обычно я использую его, как вы уже ранее демонстрировали.
Однако вы можете исследовать разницу между alias
и alias_method
. Это одна из тех сложных областей рубина, которая может быть немного интуитивно понятной. В частности, поведение alias
в отношении потомков, вероятно, не то, что вы ожидаете.
Надеюсь, это поможет!