programing

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

minimums 2023. 6. 2. 20:19
반응형

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"은 개발자에 정의된 메서드 "full_name"을 선택할 수 없습니다.

는 는이유 때문입니다.alias키워드이며 어휘적으로 범위가 지정됩니다.치료한다는 뜻입니다.self소스 코드를 읽었을 때의 self 값으로서.으로 그에반서해.alias_method 식간self실행 시간에 결정된 값입니다.

출처: http://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

하는 의견.aliasalias_method문서에서 무시합니다.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/

"너무 많은 사람들, 너무 많은 마음들"인 것 같습니다.는 작자가사권이는문전서서에하장용을성서문에ages▁from▁use▁to서▁encour▁author이전▁the를 사용하도록 권장합니다.alias_method후자는 을 사용할 것을 제안합니다.alias.

그러나 위의 블로그 게시물과 답변에는 이러한 방법에 대한 공통적인 개요가 있습니다.

  • 사용하다alias로 때
  • 사용하다alias_method 수 있도록

루보캅 보석 기부자들은 루비 스타일 가이드에서 다음과 같이 제안합니다.

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

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_calias new_calias, old_calias

old_proxynew_proxy가 사용될 클래스로 상속되는 클래스 또는 모듈에서 선언됩니다.

변수 또는 방법이 모두 될 수 있습니다.

Class_1에 old_method가 있고 Class_2와 Class_3이 모두 Class_1을 상속한다고 가정합니다.

Class_2 및 Class_3의 초기화가 Class_1에서 수행되는 경우 Class_2 및 Class_3에서 둘 다 다른 이름을 사용할 수 있습니다.

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

반응형