development

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

big-blog 2020. 3. 1. 16:00
반응형

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


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

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

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


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

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

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

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

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

이것은 이제 Ruby 스타일 가이드 에서 처리됩니다 .

이 컨텍스트에서 자체의 해상도가 어휘이므로 어휘 클래스 범위의 앨리어싱 메서드를 별칭으로 사용하는 경우 별칭을 선호하며, 명시 적으로 지정하지 않는 한 런타임 또는 하위 클래스에 의해 별칭의 방향이 변경되지 않음을 사용자에게 명확하게 전달합니다.

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에서 이름이 다르고 사용법도 다릅니다.


사소한 것이지만 alias_method보다 별명에 대해 두 가지가 좋습니다.

(1) 별칭이 짧습니다

(2)를 입력 할 필요는 없습니다.

이것은 작지만, 몇 년이지나면서이 작업을 몇 백 번 수행하면 가능할 때마다 별칭을 선호하는 경향이 있습니다.

참고 URL : https://stackoverflow.com/questions/4763121/should-i-use-alias-or-alias-method



반응형