alias 또는 alias_method를 사용해야합니까?


353

나는에 블로그 게시물을 발견 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

블로그 게시물 링크는 여기


4
그 게시물이 귀하의 질문에 대답하지 않습니까?
moinudin 2018 년

4
@marcog : 나는 그것을 읽었으며 확신하지 못했습니다. 메서드 내에서 별칭을 정의하면 자주 수행하지 않아야합니다.
Boris Stitnicky

2
@digitalextremist 링크 작동
lukas.pukenis

4
루비 스타일 가이드는 이제 alias"어휘 클래스 범위의 alias_method앨리어싱 방법 "과 "런타임에 모듈, 클래스 또는 싱글 톤 클래스의 앨리어싱 방법"을 권장
jtzero

답변:


380

alias_method필요한 경우 재정의 할 수 있습니다. ( Module클래스에 정의되어 있습니다.)

alias의 행동은 범위에 따라 변하며 때로는 예측할 수 없을 수도 있습니다.

평결 : 사용 alias_method-그것은 당신에게 훨씬 더 많은 유연성을 제공합니다.

용법:

def foo
  "foo"
end

alias_method :baz, :foo

43
예측할 수 없다는 것은 무엇을 의미합니까? 순진하게도 유연성이 떨어지는 옵션이 더 예측 가능하다고 말할 것입니다. 또한 alias_method를 재정 의하여 얻을 수있는 실질적인 예를 제공 할 수 있습니까?
Boris Stitnicky

7
사용 사례의 예 : alias :new_method_name :old_method_nameORalias_method :new_method_name, :old_method_name
boulder_ruby 0시 28 분

10
그가 찾고있는 단어가 더 기대되는 결과입니다. alias_method는 코드를 읽을 때가 아니라 런타임에 결정 alias되므로 예상 대로 동작 합니다.
Joshua Pinter

4
런타임 중에 메소드가 즉시 정의 될 것으로 기대하는 것은 대부분의 프로그래머가 기대하는 것이 아닙니다. 적어도 그것은 나에게 돼지를 날리는 것과 같습니다.
akostadinov

10
하나는 동일한를 주장 할 수 defdefine_method" define_method. 필요가있을 경우 다시 정의 할 수 있습니다 (그것이 정의 있어요 Module. 클래스) def의 동작은 그 범위에 따라 변경 및 시간에 확실히 예측할 수 없습니다 평결 : 사용. define_method- 그것은 당신에게 t을 제공합니다 더 많은 유연성. "
다니엘 Rikowski

62

구문 외에도 주요 차이점은 범위 지정에 있습니다 .

# 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


35

alias대신 alias_method에 rdoc에서 의미를 인식하여 생성 된 문서에서 깔끔한 상호 참조를 유발하는 반면 rdoc은 완전히 무시한다는 점이 유리 alias_method합니다.


56
RDoc은 alias_method를 alias와 동일하게 취급해야합니다. 우리는 그들에 대해 이야기해야한다;)
Szymon Jeż

9
RDoc은 런타임에 평가되는 메소드의 결과를 어떻게 이해해야합니까?

@ user1115652 누군가 원숭이 패치를 했을 가능성이alias_method 있습니까? 즉 보인다 정말 가능성, 누군가가 그 않는 경우, 그들은 RDoc에서 결과를 고통을 기꺼이한다. 요점이 불가능하다고 생각한다면, 왜 그렇게 생각하고 Yardoc은 어떻게 생각합니까?
iconoclast

35

나는 메소드 이름 별칭을 등록하기 위해 '별칭'을 사용한다고 쓰여진 규칙 (약식과 같은 규칙)이 있다고 생각합니다. 코드 사용자에게 하나 이상의 이름으로 하나의 메소드를 제공하려는 경우를 의미합니다.

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

23

질문을 한 지 1 년 후에 주제에 관한 새로운 기사가 ​​나옵니다.

http://erniemiller.org/2014/10/23/in-defense-of-alias/

"너무 많은 사람, 너무 많은 마음"인 것 같습니다. 이전 기사에서 저자는 사용을 권장 alias_method하지만 후자는 사용을 제안 alias합니다.

그러나 블로그 게시물과 위의 답변 모두에서 이러한 방법에 대한 일반적인 개요가 있습니다.

  • alias앨리어싱을 정의 된 범위로 제한하려는 경우 사용
  • alias_method상속 된 클래스가 액세스 할 수 있도록 하는 데 사용

16

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

0

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에서 이름이 다를 수 있으며 사용법도 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.