क्या मुझे उपनाम या 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
क्या यह पोस्ट आपके प्रश्न का उत्तर नहीं देता है?
मोइनुद्दीन

4
@marcog: मैंने इसे पढ़ा है, और मैं आश्वस्त नहीं हूं। तरीकों के अंदर उपनामों को परिभाषित करना, ऐसा कुछ नहीं है जो अक्सर करना चाहिए।
बोरिस स्टिटनिक


4
रूबी स्टाइल गाइड अब alias"जब लेक्सिकल क्लास स्कोप में अलियासिंग मेथड्स" और alias_method"रनटाइम पर मॉड्यूल, क्लासेस, या सिंगलटन क्लासेस के अलियासिंग मेथड" github.com/bbatsov/ruby-style-guide#alias-method-lexically
jtzero की सिफारिश करता है।

जवाबों:


380

alias_methodजरूरत पड़ने पर पुनर्परिभाषित किया जा सकता है। (यह Moduleकक्षा में परिभाषित किया गया है ।)

aliasइसके दायरे के आधार पर व्यवहार में परिवर्तन होता है और यह कई बार अप्रत्याशित हो सकता है।

फैसले: उपयोग alias_method- यह आपको एक टन अधिक लचीलापन देता है।

उपयोग:

def foo
  "foo"
end

alias_method :baz, :foo

43
अप्रत्याशित से आपका क्या मतलब है वास्तव में, कोई यह कहेगा कि विकल्प जो कम लचीला है, वह अधिक अनुमानित होगा। इसके अलावा, क्या आप alias_method को पुनर्परिभाषित करने से लाभ का कोई व्यावहारिक उदाहरण प्रदान कर सकते हैं?
बोरिस स्टिटनिक

7
उदाहरण का उपयोग करें मामला: alias :new_method_name :old_method_nameORalias_method :new_method_name, :old_method_name
boulder_ruby

10
जिस शब्द को वह यहाँ खोज रहा है, वह अधिक अपेक्षित परिणाम है। alias_methodरनटाइम पर निर्धारित किया जाता है, न कि जब कोड को पढ़ा जाता है, जैसे alias, तो यह अधिक व्यवहार करता है कि हम इससे कैसे उम्मीद करेंगे।
जोशुआ पिंटर

4
उम्मीद है कि रनटाइम के दौरान मक्खी पर तरीकों को परिभाषित किया जाता है, जो कि अधिकांश प्रोग्रामर उम्मीद नहीं करते हैं। कम से कम यह मेरे लिए उड़ान भरने वाले सूअर की तरह है।
अकोस्टैडिनोव

10
एक ही defबनाम के लिए एक ही तर्क दिया जा सकता है define_method: " define_methodयदि आवश्यक हो तो इसे फिर से परिभाषित किया जा सकता है। (यह Moduleवर्ग में परिभाषित किया गया है ।) defका व्यवहार इसके दायरे के आधार पर बदलता है और कई बार काफी अप्रत्याशित हो सकता है। फैसले: उपयोग define_method- यह आपको एक टन देता है। अधिक लचीलापन। "
डैनियल रिकोव्स्की

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'

उपरोक्त मामले में विधि "नाम" "डेवलपर" वर्ग में परिभाषित विधि "पूर्ण_नाम" चुनती है। अब साथ देने की कोशिश करते हैं 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'

उपनाम के उपयोग के साथ विधि "नाम" डेवलपर में परिभाषित विधि "full_name" लेने में सक्षम नहीं है।

ऐसा इसलिए है क्योंकि aliasयह एक कीवर्ड है और इसे लेक्सिकली स्कोप किया गया है। इसका मतलब है कि यह 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
हो सकता है कि आरडीओसी को अलियास के रूप में उर्फ_मेथोड का इलाज शुरू करना चाहिए। हमें उन्हें इसके बारे में बताना चाहिए;)
सिजोन जेई सेप

9
आरडीओसी को एक विधि के परिणामों को कैसे समझना चाहिए जो रनटाइम पर मूल्यांकन किया जाता है?

@ user1115652 क्या आपकी बात यह है कि किसी को बंदर-पैच हो सकता हैalias_method ? ऐसा लगता है कि वास्तव में संभावना नहीं है, और अगर कोई ऐसा करता है, तो उन्हें आरडोक में परिणाम भुगतने के लिए तैयार होना चाहिए। यदि आपकी बात यह है कि यह असंभव है, तो आप ऐसा क्यों सोचते हैं और आपको क्या लगता है कि येर्डोक क्या करता है?
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

प्रश्न पूछने के एक साल बाद इस विषय पर एक नया लेख आता है:

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

ऐसा लगता है कि "इतने सारे पुरुष, इतने सारे मन।" पूर्व लेख से लेखक उपयोग करने के लिए प्रोत्साहित करता है alias_method, जबकि उत्तरार्द्ध का उपयोग करने का सुझाव देता हैalias

हालाँकि ऊपर ब्लॉगपोस्ट और उत्तर में इन विधियों का एक सामान्य अवलोकन है:

  • उपयोग alias गुंजाइश जहां यह निर्धारित किया है करने के लिए सीमा अलियासिंग जब आप चाहते हैं
  • alias_methodविरासत में मिली कक्षाओं का उपयोग करने की अनुमति देने के लिए इसका उपयोग करें

16

रूबॉप मणि योगदानकर्ताओं ने अपने रूबी स्टाइल गाइड में प्रस्ताव रखा :

जब इस संदर्भ में स्वयं के संकल्प के रूप में लेक्सिकल वर्ग के दायरे में एलियासिंग तरीकों को भी छोड़ दें, और यह उपयोगकर्ता को स्पष्ट रूप से सूचित करता है कि आपके उपनाम का अप्रत्यक्ष रनटाइम में या किसी भी उपवर्ग में परिवर्तन नहीं किया जाएगा जब तक कि स्पष्ट नहीं किया जाता है।

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 और इसके उपयोग में दोनों का अलग-अलग नाम हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.