রুবিতে মডিউল ভেরিয়েবল তৈরি করুন


111

রুবিতে কোনও মডিউলে কোনও বর্ধনশীল তৈরির কোনও উপায় আছে যা শ্রেণি ভেরিয়েবলের অনুরূপ আচরণ করবে? আমি এর দ্বারা যা বোঝাতে চাইছি তা হ'ল এটি মডিউলটির কোনও উদাহরণ শুরু না করেই অ্যাক্সেস করতে সক্ষম হবে তবে এটি পরিবর্তন করা যেতে পারে (মডিউলগুলির ধ্রুবকের মত নয়)।

উত্তর:


158

রুবি স্থানীয়ভাবে মডিউলগুলিতে শ্রেণীর ভেরিয়েবলগুলি সমর্থন করে, তাই আপনি সরাসরি শ্রেণি ভেরিয়েবলগুলি ব্যবহার করতে পারেন, এবং কিছু প্রক্সি বা সিউডো-শ্রেণি-ভেরিয়েবলগুলি নয়:

module Site
  @@name = "StackOverflow"

  def self.setName(value)
    @@name = value
  end

  def self.name
    @@name
  end
end

Site.name            # => "StackOverflow"
Site.setName("Test")
Site.name            # => "Test"

5
+1 আসলে, আমি ভাবছিলাম যে 'শ্রেণি ভেরিয়েবল' শব্দটি বিভ্রান্তিকর। ক্লাসগুলি মডিউলগুলির বিশেষ ক্ষেত্রে এবং ক্লাস ভেরিয়েবলগুলি মডিউলগুলির উপর নির্ভরযোগ্য। এগুলিকে মডিউল ভেরিয়েবল বলা উচিত।
সাওয়া

3
@sawa: এটা কিছুটা বিভ্রান্তিকর, কিন্তু এটা কি রুবি নিজেই ব্যবহার আছে: defined?(@@foo) => "class variable"
অ্যান্ড্রু গ্রিম

1
অথবা তাদের স্থির ক্ষেত্র বলা যেতে পারে। মনে হয় তারা কি।
পিটার আজতাই

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

2
কেন শেষে বিভিন্ন কল: T.getএবং T::get?
অন্তর্নিহিত

31

যদি আপনাকে এটিকে কোনও উদাহরণের মধ্যে থেকে কল করার প্রয়োজন না হয়, আপনি কেবল মডিউল বডিটির মধ্যে উদাহরণ ভেরিয়েবল ব্যবহার করতে পারেন।

module SomeModule
  module_function
  def param; @param end
  def param= v; @param = v end
end

SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1

উদাহরণস্বরূপ ভেরিয়েবলটি @paramমডিউলটির অন্তর্ভুক্ত হবে SomeModule, এটি Moduleশ্রেণীর উদাহরণ ।


23

আপনি মডিউলে একটি শ্রেণীর উদাহরণ পরিবর্তনশীল সেট করতে পারেন।

module MyModule
   class << self; attr_accessor :var; end
end

MyModule.var = 'this is saved at @var'

MyModule.var    
=> "this is saved at @var"

+1, তবে আমি কেবল জোর দিয়ে বলব যে শ্রেণীর উদাহরণের ভেরিয়েবলগুলি ক্লাস ভেরিয়েবলের থেকে পৃথক।
অ্যান্ড্রু গ্রিম

4
হ্যাঁ পুরোপুরি .. এবং বিটিডব্লিউ .. আমি ক্লাস ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দিচ্ছি না .. আপনি যখন এগুলি ব্যবহার করেন তখন কিছু অপ্রত্যাশিত জিনিস ঘটে থাকে .. কিছু উদাহরণ দেখতে এই নিবন্ধটি পরীক্ষা করুন oreillynet.com/ruby/blog/2007/01/…
অরল্যান্ডো

8

আপনি মডিউল সংজ্ঞা মধ্যে মান শুরু করতে পারেন:

module MyModule
  class << self
    attr_accessor :my_variable
  end
  self.my_variable = 2 + 2
end

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