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

나는에 블로그 게시물을 발견 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에서 이름이 다를 수 있으며 사용법도 다릅니다.