আমি কি উপনাম বা ওরফে_মোথড ব্যবহার করব?


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

ওরফে_মোথডের ব্যবহার

class User

  def full_name
    puts "Johnnie Walker"
  end

  alias_method :name, :full_name
end

User.new.name #=>Johnnie Walker

ব্লগ পোস্ট লিঙ্ক এখানে


4
এই পোস্টটি আপনার প্রশ্নের উত্তর দেয় না?
মoinনুদ্দিন

4
@ মারকগ: আমি এটি পড়েছি, এবং আমি বিশ্বাস করি না। পদ্ধতির অভ্যন্তরের উপকরণগুলি সংজ্ঞা দেওয়া, এটি প্রায়শই করা উচিত নয় something
বোরিস স্ট্যাটনিকি

2
@ ডিজিটালেক্সট্রিমিস্ট লিঙ্কটি কাজ করে
lukas.pukenis

4
রুবি স্টাইল গাইড এখন alias"লেক্সিকাল ক্লাস স্কোপ alias_methodপদ্ধতিতে অ্যালিজিং
ক্লাসের

উত্তর:


380

alias_methodপ্রয়োজনে নতুন সংজ্ঞা দেওয়া যেতে পারে। (এটি Moduleক্লাসে সংজ্ঞায়িত করা হয়েছে ))

aliasএর স্কোপের উপর নির্ভর করে এর আচরণ পরিবর্তন হয় এবং অনেক সময় এটি অনাকাঙ্ক্ষিতও হতে পারে।

প্রত্যয়: ব্যবহার alias_method- এটি আপনাকে আরও এক টন আরও নমনীয়তা দেয়।

ব্যবহার:

def foo
  "foo"
end

alias_method :baz, :foo

43
অপ্রত্যাশিত বলতে কী বোঝ? অবশ্যই, একজন বলবেন যে বিকল্পটি কম নমনীয় হবে তা আরও অনুমানযোগ্য হবে। এছাড়াও, আপনি ওরফে_মোথোডের পুনরায় সংজ্ঞা দিয়ে উপকারের কোনও ব্যবহারিক উদাহরণ দিতে পারেন?
বোরিস স্ট্যাটনিকি

7
উদাহরণস্বরূপ ব্যবহারের কেস: alias :new_method_name :old_method_nameবাalias_method :new_method_name, :old_method_name
বোল্ডার_রবি

10
তিনি এখানে যে শব্দটির সন্ধান করছেন তা প্রত্যাশিত ফলাফল। alias_methodরানটাইমে নির্ধারিত হয় এবং কোডটি পড়ার সময় নয়, যেমন হয় alias, সুতরাং এটি আমাদের কীভাবে প্রত্যাশা করে তা আরও বেশি আচরণ করে।
জোশুয়া পিন্টার 22'14

4
রানটাইমের সময় ফ্লাইগুলিতে পদ্ধতিগুলি সংজ্ঞায়িত করা আশা করা বেশিরভাগ প্রোগ্রামারদের প্রত্যাশা নয়। কমপক্ষে এটি আমার কাছে বিমানের শূকরদের মতো।
আকোস্তাদিনভ 21

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'

উপনামের ব্যবহারের সাথে "নাম" পদ্ধতিটি বিকাশকারীতে সংজ্ঞায়িত "পূর্ণ নাম" পদ্ধতিটি বেছে নিতে সক্ষম হয় না।

এটি কারণ aliasএকটি কীওয়ার্ড এবং এটি বর্ণনামূলকভাবে বাদ পড়েছে op এর অর্থ 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 ? এটি সত্যিই অসম্ভব বলে মনে হচ্ছে এবং যদি কেউ এটি করে তবে তাদের আরডিওকে পরিণতি ভোগ করতে ইচ্ছুক হওয়া উচিত। যদি আপনার বক্তব্যটি এটি অসম্ভব, তবে আপনি কেন এটি ভাবেন এবং ইয়ার্ডোক এটি কীভাবে মনে করেন?
আইকনোক্লাস্ট

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

রুবোকপ রত্ন অবদানকারীরা তাদের রুবি স্টাইল গাইডে প্রস্তাব দেয় :

লেক্সিক্যাল ক্লাস স্কোপে পদ্ধতিগুলি অ্যালিজিংয়ের সময় উলেফটিকে অগ্রাধিকার দিন যখন এই প্রসঙ্গে স্ব-রেজোলিউশনটি যুক্তিযুক্ত হয়, এবং এটি ব্যবহারকারীর কাছে স্পষ্টভাবে জানিয়ে দেয় যে আপনার উলামের ইন্ডিয়ারেশন রানটাইম বা কোনও সাবক্লাস দ্বারা সুস্পষ্ট না করা পরিবর্তিত হবে না unless

class Westerner
  def first_name
   @names.first
  end

 alias given_name first_name
end

রানটাইমের সময় মডিউল, ক্লাস, বা সিঙ্গেলন ক্লাসের পদ্ধতিগুলি অ্যালিজ করার সময় সর্বদা উপনাম_মথোড ব্যবহার করুন, কারণ উপনামের সংক্ষিপ্ত ক্ষেত্র এই ক্ষেত্রে অনিশ্চয়তার দিকে নিয়ে যায়

module Mononymous
  def self.included(other)
    other.class_eval { alias_method :full_name, :given_name }
  end
end

class Sting < Westerner
  include Mononymous
end

0

ওরফে_মোথড নতুন_মোথ , পুরানো_মোথড

ওল্ড_মোথোড এমন একটি ক্লাস বা মডিউল হিসাবে ঘোষণা করা হবে যা এখন আমাদের ক্লাসে উত্তরাধিকার সূত্রে প্রাপ্ত যেখানে নতুন_মোথড ব্যবহৃত হবে।

এগুলি পরিবর্তনশীল বা পদ্ধতি উভয়ই হতে পারে।

ধরুন ক্লাস_1 এর পুরানো_মোথড রয়েছে, এবং ক্লাস_2 এবং ক্লাস_3 উভয়ই ক্লাস_1 এর উত্তরাধিকারী।

যদি, Class_2 এবং Class_3 এর সূচনা ক্লাস_1 এ করা হয় তবে ক্লাস_2 এবং Class_3 এবং এর ব্যবহারের ক্ষেত্রে উভয়েরই আলাদা নাম থাকতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.