나는에 블로그 게시물을 발견 alias
대를 alias_method
. 해당 블로그 게시물에 제공된 예제에서 볼 수 있듯이 동일한 클래스 내에서 메소드를 다른 클래스의 별칭으로 지정하고 싶습니다. 어느 것을 사용해야합니까? 나는 항상 alias
사용되는 것을 보지만 누군가 나에게 alias_method
더 좋다고 말했다 .
별명 사용
class User
def full_name
puts "Johnnie Walker"
end
alias name full_name
end
User.new.name #=>Johnnie Walker
alias_method 사용법
class User
def full_name
puts "Johnnie Walker"
end
alias_method :name, :full_name
end
User.new.name #=>Johnnie Walker
답변
alias_method
필요한 경우 재정의 할 수 있습니다. ( Module
클래스에 정의되어 있습니다.)
alias
의 행동은 범위에 따라 변하며 때로는 예측할 수 없을 수도 있습니다.
평결 : 사용 alias_method
-그것은 당신에게 훨씬 더 많은 유연성을 제공합니다.
용법:
def foo
"foo"
end
alias_method :baz, :foo
답변
구문 외에도 주요 차이점은 범위 지정에 있습니다 .
# scoping with alias_method
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias_method :name, :full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Geeky geek'
위의 경우 “name”메소드는 “Developer”클래스에 정의 된 “full_name”메소드를 선택합니다. 이제 시도해 봅시다 alias
.
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias name full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Johnnie Walker'
별명을 사용하면 “name”메소드가 Developer에 정의 된 “full_name”메소드를 선택할 수 없습니다.
alias
키워드 이기 때문에 어휘 범위 가 있기 때문 입니다. self
소스 코드를 읽을 때 self 값으로 취급한다는 의미 입니다. 반대로 런타임에 결정된 값 으로 alias_method
처리 self
됩니다.
출처 : http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
답변
alias
대신 alias_method
에 rdoc에서 의미를 인식하여 생성 된 문서에서 깔끔한 상호 참조를 유발하는 반면 rdoc은 완전히 무시한다는 점이 유리 alias_method
합니다.
답변
나는 메소드 이름 별칭을 등록하기 위해 ‘별칭’을 사용한다고 쓰여진 규칙 (약식과 같은 규칙)이 있다고 생각합니다. 코드 사용자에게 하나 이상의 이름으로 하나의 메소드를 제공하려는 경우를 의미합니다.
class Engine
def start
#code goes here
end
alias run start
end
코드를 확장해야하는 경우 루비 메타 대안을 사용하십시오.
class Engine
def start
puts "start me"
end
end
Engine.new.start() # => start me
Engine.class_eval do
unless method_defined?(:run)
alias_method :run, :start
define_method(:start) do
puts "'before' extension"
run()
puts "'after' extension"
end
end
end
Engine.new.start
# => 'before' extension
# => start me
# => 'after' extension
Engine.new.run # => start me
답변
질문을 한 지 1 년 후에 주제에 관한 새로운 기사가 나옵니다.
http://erniemiller.org/2014/10/23/in-defense-of-alias/
“너무 많은 사람, 너무 많은 마음”인 것 같습니다. 이전 기사에서 저자는 사용을 권장 alias_method
하지만 후자는 사용을 제안 alias
합니다.
그러나 블로그 게시물과 위의 답변 모두에서 이러한 방법에 대한 일반적인 개요가 있습니다.
alias
앨리어싱을 정의 된 범위로 제한하려는 경우 사용alias_method
상속 된 클래스가 액세스 할 수 있도록 하는 데 사용
답변
rubocop gem 기고자들은 Ruby Style Guide 에서 제안합니다 .
이 컨텍스트에서 자체의 해상도가 어휘이므로 어휘 클래스 범위에서 앨리어싱 메서드를 별칭으로 지정할 때 별칭을 선호하며, 명시 적으로 지정하지 않는 한 런타임 또는 하위 클래스에 의해 별칭의 방향이 변경되지 않음을 사용자에게 명확하게 전달합니다.
class Westerner
def first_name
@names.first
end
alias given_name first_name
end
별칭의 어휘 범위는 이러한 경우 예측할 수 없으므로 런타임에 모듈, 클래스 또는 싱글 톤 클래스의 메소드를 앨리어싱 할 때는 항상 alias_method를 사용하십시오.
module Mononymous
def self.included(other)
other.class_eval { alias_method :full_name, :given_name }
end
end
class Sting < Westerner
include Mononymous
end
답변
alias_method new_method , old_method
OLD_METHOD 경우 우리의 클래스에 지금 상속되는 클래스 또는 모듈에서 선언됩니다 NEW_METHOD이 사용됩니다.
이들은 가변적이거나 방법 둘 다일 수 있습니다.
Class_1에 old_method가 있고 Class_2와 Class_3이 모두 Class_1을 상속한다고 가정합니다.
Class_2 및 Class_3의 초기화가 Class_1에서 완료되면 Class_2와 Class_3에서 이름이 다를 수 있으며 사용법도 다릅니다.