রুবি: স্ব প্রসারিত করুন


113

রুবিতে, আমি এর প্রাথমিক ধারণাটি বুঝতে পারি extend। যাইহোক, কোডের এই বিভাগে কি হচ্ছে? বিশেষত, কি করে extend? শ্রেণি পদ্ধতিতে উদাহরণ পদ্ধতিগুলি তৈরি করার কি এটি কেবল সুবিধাজনক? আপনি কেন প্রথম থেকেই শ্রেণি পদ্ধতি নির্দিষ্টকরণের চেয়ে এভাবে চলবেন?

module Rake
  include Test::Unit::Assertions

  def run_tests # etc.
  end

  # what does the next line do?
  extend self
end

উত্তর:


115

শ্রেণি পদ্ধতিতে উদাহরণ পদ্ধতি তৈরি করা এটি একটি সুবিধাজনক উপায়। তবে আপনি এটিকে আরও দক্ষ সিঙ্গলটন হিসাবে ব্যবহার করতে পারেন ।


2
এই ধরণের সিঙ্গেলটন কেন আরও দক্ষ?
xuuso

5
আপনার লিঙ্কটি আমার বন্ধুটিকে পচা করেছে।
ইউলিস বিএন

1
এই উত্তরটি আর্কাইভ.অর্গ
মাইক সিজেন্ডেল

1
এই উত্তরটি অপর্যাপ্ত কারণ এটি প্রশ্নের ব্যাখ্যা করে না কীভাবে কীওয়ার্ডটি উদাহরণ পদ্ধতিগুলিকে শ্রেণিবদ্ধায় পরিণত করে। এটি 'আরও দক্ষ সিঙ্গলটন' কী বা এর সাথে কী extend selfকরতে হবে তাও ব্যাখ্যা করে না ।
জায়েকি

29

একটি মডিউলে, স্বয়ং মডিউল শ্রেণি class উদাহরণস্বরূপ

puts self

রাকে তাই ফিরিয়ে দেবে,

extend self

মূলত রেকে সংজ্ঞায়িত উদাহরণ পদ্ধতিগুলি এর জন্য উপলব্ধ করে তোলে, তাই আপনি এটি করতে পারেন

Rake.run_tests

23

আমার জন্য এটা সবসময় মনে করতে সাহায্য করে extendযেমন includeSingleton বর্গ (এছাড়াও মেটা বা eigen শ্রেণী হিসেবে পরিচিত) ভিতরে।

আপনি সম্ভবত জানেন যে সিঙ্গলটন শ্রেণীর অভ্যন্তরে সংজ্ঞায়িত পদ্ধতিগুলি মূলত শ্রেণি পদ্ধতি:

module A
  class << self
    def x
      puts 'x'
    end
  end
end

A.x #=> 'x'

এখন আমরা জানি যে, যে extendহবে includeSingleton শ্রেণীর ভিতরের এবং এইভাবে মডিউলে পদ্ধতি তাদের বর্গ পদ্ধতি যেমন এক্সপোজ:

module A
  class << self
    include A

    def x
      puts 'x'
    end
  end

  def y
    puts 'y'
  end
end

A.x #=> 'x'
A.y #=> 'y'

15

লিঙ্ক পচা এড়াতে, ব্যবহারকারীর দ্বারা লিঙ্ক করা ক্রিস ওয়ানস্ট্রথের ব্লগ পোস্ট 83510 নীচে পোস্ট করা হয়েছে (তার অনুমতি নিয়ে)। তবুও, কোনও কিছুই আসলকে আঘাত করে না, সুতরাং যতক্ষণ কাজ চালিয়ে যায় ততক্ষণ তার লিঙ্কটি ব্যবহার করুন।


→ সিঙ্গিন 'সিলেটলেটস 18 নভেম্বর 2008 এখানে এমন জিনিস রয়েছে যা আমি ঠিক বুঝতে পারি না। উদাহরণস্বরূপ ডেভিড বোয়ি। বা দক্ষিণ গোলার্ধে। তবে রুবির সিঙ্গলটনের মতো কোনও কিছুই আমার মনকে ঘিরে ধরে না। কারণ সত্যই, এটি সম্পূর্ণ অপ্রয়োজনীয়।

আপনার কোডটি দিয়ে তারা যা করতে চায় তা এখানে:

require 'net/http'

# first you setup your singleton
class Cheat
  include Singleton

  def initialize
    @host = 'http://cheat.errtheblog.com/'
    @http = Net::HTTP.start(URI.parse(@host).host)
  end


  def sheet(name)
    @http.get("/s/#{name}").body
  end
end

# then you use it
Cheat.instance.sheet 'migrations'
Cheat.instance.sheet 'yahoo_ceo'

তবে এটি পাগল। শক্তির যুদ্ধ.

require 'net/http'

# here's how we roll
module Cheat
  extend self

  def host
    @host ||= 'http://cheat.errtheblog.com/'
  end

  def http
    @http ||= Net::HTTP.start(URI.parse(host).host)
  end

  def sheet(name)
    http.get("/s/#{name}").body
  end
end

# then you use it
Cheat.sheet 'migrations'
Cheat.sheet 'singletons'

না কেন? এপিআই আরও সংক্ষিপ্ত, কোডটি পরীক্ষা করা, উপহাস করা এবং স্টাব করা সহজ, এবং প্রয়োজন দেখা দেওয়ার পরে এটি সঠিক শ্রেণিতে রূপান্তরিত হওয়া এখনও মৃত।

((কপিরাইটের দশ খ্রিস্টের উচিত নয়))


লিঙ্করোট এড়ানোর আরেকটি উপায় হ'ল ওয়েবব্যাক মেশিনের মতো কিছু ব্যবহার করা - ওয়েব.আরচাইভ.অর্গ - এটি ওয়েব জুড়ে পৃষ্ঠাগুলির ইতিহাস রাখে, যাইহোক লিংক্রোটের অনেক ক্ষেত্রে আমি এটি বেশ সহায়ক বলে মনে করেছি।
কেম ম্যাসন

3

extend selfমডিউল পদ্ধতি হিসাবে সমস্ত বিদ্যমান উদাহরণ পদ্ধতি অন্তর্ভুক্ত। এটি বলার সমতুল্য extend Rake। এছাড়াও Rakeবর্গ হল একটি অবজেক্ট Module

সমতুল্য আচরণ অর্জনের আর একটি উপায় হ'ল:

module Rake
  include Test::Unit::Assertions

  def run_tests # etc.
  end

end 

Rake.extend(Rake)

এটি ব্যক্তিগত পদ্ধতিগুলির সাথে স্ব-সংযুক্ত মডিউলগুলি সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে।

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