রুবির ডাবল-কোলন is :: `কী?


426

এই ডাবল-কোলন ::কি? যেমন Foo::Bar

আমি একটি সংজ্ঞা পেয়েছি :

::একটি ইউনারী অপারেটর যে দেয়: ধ্রুবক, উদাহরণস্বরূপ পদ্ধতি এবং বর্গ পদ্ধতি, একটি বর্গ বা মডিউল মধ্যে সংজ্ঞায়িত বর্গ বা মডিউল বাইরে কোথাও থেকে অ্যাক্সেস করতে হবে।

স্কোপ (প্রাইভেট, সুরক্ষিত) কী ভাল যদি আপনি কেবল ::কিছু প্রকাশ করতে ব্যবহার করতে পারেন ?


175
ভবিষ্যতের গুগলদের সুবিধার জন্য, আপনি যদি একটি প্রতীক অনুসন্ধানের চেষ্টা করছেন, সিম্বলহাউন্ড ডট কম
অ্যান্ড্রু গ্রিম

1
সম্ভাব্য সদৃশ? stackoverflow.com/questions/2276905/what-does-mean-in-ruby
iX3


6
আপনাকে ধন্যবাদ, অ্যান্ড্রুগ্রিম। এই সপ্তাহে আমি এটিই দেখেছি সেরা জিনিস।
অ্যাবিগার

উত্তর:


381

::মূলত একটি নেমস্পেস রেজোলিউশন অপারেটর। এটি আপনাকে মডিউলগুলিতে আইটেমগুলি বা ক্লাসে শ্রেণিক স্তরের আইটেমগুলি অ্যাক্সেস করার অনুমতি দেয়। উদাহরণস্বরূপ, বলুন যে আপনার এই সেটআপটি ছিল:

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

আপনি CONSTANTমডিউলটির বাইরে থেকে অ্যাক্সেস করতে পারেন SomeModule::InnerModule::MyClass::CONSTANT

এটি ক্লাসে সংজ্ঞায়িত উদাহরণ পদ্ধতিগুলিকে প্রভাবিত করে না, যেহেতু আপনি আলাদা সিনট্যাক্সের (বিন্দু .) এগুলি অ্যাক্সেস করেন ।

প্রাসঙ্গিক দ্রষ্টব্য: আপনি যদি শীর্ষ-স্তরের নেমস্পেসে ফিরে যেতে চান তবে এটি করুন: :: সোমারমডুল - বেঞ্জামিন ওকস


5
সি # তে, উদাহরণস্বরূপ, হ্যাঁ। অন্যদিকে সি ++ (এবং রুবি) ::নেমস্পেস রেজোলিউশনের জন্য ব্যবহার করুন যেমনstd::cout << "Hello World!";
জেরি ফার্নহলজ

142
প্রাসঙ্গিক দ্রষ্টব্য: আপনি যদি শীর্ষ-স্তরের নেমস্পেসে ফিরে যেতে চান তবে এটি করুন: ::SomeModule
বেনজামিন

5
@ বেঞ্জামিন নেতৃস্থানীয় কলোনগুলি বোঝানো হয়েছে, যদি না আমি অন্য মডিউলে সামোমডুল রাখি এবং এর পরিবর্তে আমি শীর্ষ-স্তরের একটি পেতে চাই, সঠিক?
জো লিস

7
@ জো হ্যাঁ আপনি যদি শীর্ষ স্তরের নেমস্পেসের ধ্রুবক বা অন্য একটি মডিউলে একই নামটির ধ্রুবক (যেমন: সামোথারমডুল :: ক্লাসমেথডস) উল্লেখ করছেন তা নিশ্চিত করতে চাইলে এটি সহায়ক হতে পারে।
বেনজামিন

2
এটি অনেকটা সি ++ এর স্কোপ
অপেন্ডেন্ডের

111

এই সাধারণ উদাহরণটি এটি চিত্রিত করে:

MR_COUNT = 0        # constant defined on main Object class
module Foo
  MR_COUNT = 0
  ::MR_COUNT = 1    # set global count to 1
  MR_COUNT = 2      # set local count to 2
end

puts MR_COUNT       # this is the global constant: 1
puts Foo::MR_COUNT  # this is the local constant: 2

Http://www.tutorialspoint.com/ruby/ruby_operators.htm থেকে নেওয়া


এই যদিও সতর্কতা কারণ। সতর্কতা এড়ানোর কোনও উপায় আছে কি?
নুলভক্সপপুলি

3
@ নলভক্সপোপুলি সাধারণত ধ্রুবকগুলিকে সংশোধন করা খুব খারাপ জিনিস তবে আপনি উদাহরণস্বরূপ যদি কোনও খারাপভাবে লিখিত রত্নটিতে একটি ধ্রুবক পরিবর্তন করতে চান এবং এটি কাঁটাচামচ করতে না চান তবে এটি মডিউলে সংকলন (: সরান_কনস্ট) ব্যবহার করে সম্পন্ন হতে পারে def এটি, তারপর ধ্রুবক পুনরায় সংজ্ঞা।
বুকঅফগ্রিগ

71

::আপনাকে অন্য ক্লাস বা মডিউলের অভ্যন্তরে সংজ্ঞায়িত স্থির, মডিউল বা ক্লাস অ্যাক্সেস করতে দেয়। নামস্থান সরবরাহ করতে এটি ব্যবহার করা হয় যাতে পদ্ধতি এবং শ্রেণীর নামগুলি বিভিন্ন লেখকের দ্বারা অন্য শ্রেণীর সাথে বিরোধ না করে।

আপনি যখন ActiveRecord::Baseরেলগুলিতে দেখেন তখন এর অর্থ হ'ল রেলগুলির মতো কিছু থাকে

module ActiveRecord
  class Base
  end
end

অর্থাত্ একটি Baseমডিউলটির ভিতরে ডাকা একটি শ্রেণি ActiveRecordযা এরপরে উল্লেখ করা হয় ActiveRecord::Base(আপনি এটি সক্রিয়রেকার্ড-এনএনএন / লিব / অ্যাক্টিভ_রেকর্ড / বেস.আরবিতে রেল উত্সে খুঁজে পেতে পারেন)

:: এর একটি সাধারণ ব্যবহার হল মডিউলগুলিতে সংজ্ঞায়িত ধ্রুবক অ্যাক্সেস করা

module Math
  PI = 3.141 # ...
end

puts Math::PI

::অপারেটর পদ্ধতি বাইপাস দৃশ্যমানতা আপনার অনুমতি দেয় না ব্যক্তিগত বা সংরক্ষিত চিহ্নিত করা হয়েছে।


7
সুতরাং যদি কারও কাছে থাকে class MyClass < ActiveRecord::Base, তার মানে কি এই যে মাইক্লাস কেবল ক্লাস বেস থেকে পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত এবং অ্যাক্টিভেকর্ড মডিউলটির ভিতরে কিছুই নয়?
চার্লি পার্কার

2
"" ব্যবহারের পরিবর্তে এই নেমস্পেস রেজোলিউশনের জন্য কেন বিশেষ ডাবল-কোলন ব্যবহার করবেন। এর জন্যও? প্রসঙ্গ এবং মূলধন অর্থের বিভ্রান্তিকে রোধ করবে এমনকি যদি আমরা "।" ব্যবহার করি, তাই না?
জোনাহ

3
@ জোনাহ এমন কিছু বিষয় রয়েছে যেখানে এটি অস্পষ্ট হবে। যেমন বিবেচনা করুন class Foo; Baz = 42; def self.Baz; "Baz method!"; end; end(পুরোপুরি বৈধ) Foo::Baz # => 42এবং Foo.Baz # => "Baz method!"। মনে রাখবেন যে Foo::Baz()(প্রথম বন্ধনী সহ) যদিও পদ্ধতিতে কল করবে।
মাইকেজ

3
সুতরাং ব্যবহারের ক্ষেত্রে এটি ক্লাস ধ্রুবক রাখার ক্ষমতা এবং সঠিক নামটি সহ একটি বর্গ পদ্ধতি সমাধান করে? বৈশিষ্ট্যের পক্ষে এটি দৃ strong় যুক্তির মতো বলে মনে হচ্ছে না। ব্যক্তিগতভাবে আমি বরং তার ক্ষমতাটি হারাতে চাই (যেভাবেই সমস্যা মনে হয়), ডাবল-কোলন হারাতে এবং ব্যবহার করতে ""। নাম স্পেসিংয়ের জন্যও .... সম্ভবত এটি ব্যবহারের অতিরিক্ত ব্যবহারের ক্ষেত্রেও থাকতে পারে?
জোনাহ

26

আপনি যদি কোনও কিছু প্রকাশের জন্য কেবল :: ব্যবহার করতে পারেন তবে সুযোগ (ব্যক্তিগত, সুরক্ষিত) কী ভাল?

রুবিতে, সমস্ত কিছু উন্মুক্ত এবং অন্য কোথাও থেকে সমস্ত কিছু সংশোধন করা যেতে পারে।

যদি আপনি "ক্লাস সংজ্ঞা" এর বাইরে থেকে ক্লাসগুলি পরিবর্তন করা যায় এই বিষয়টি নিয়ে চিন্তিত হন তবে রুবি সম্ভবত আপনার পক্ষে নয়।

অন্যদিকে, আপনি যদি জাভার ক্লাসগুলি বন্ধ করে দিয়ে হতাশ হন, তবে রুবি সম্ভবত আপনি যা খুঁজছেন।


1
আমি কিছু রুবিবাদককে শুনেছি যে দৃষ্টান্তের ভেরিয়েবলগুলি প্রকাশিত হয় না, এমনকি এটি এমন attr_accessorপদ্ধতিগুলি তৈরি করে যা ভেরিয়েবলকে সংশোধন করে। (তারপরে আবার রয়েছে instance_eval)
অ্যান্ড্রু গ্রিম

4
ঠিক আছে, আছে instance_eval। কিন্তু এছাড়াও instance_variable_getএবং আছে instance_variable_set। রুবি সীমাবদ্ধতার জন্য খুব গতিশীল।
yfeldblum

12

পূর্ববর্তী উত্তরগুলিতে যুক্ত করা, ::উদাহরণ পদ্ধতিগুলি অ্যাক্সেস করার জন্য এটি রুবি বৈধ । নিম্নলিখিত সমস্ত বৈধ:

MyClass::new::instance_method
MyClass::new.instance_method
MyClass.new::instance_method
MyClass.new.instance_method

সর্বোত্তম অনুশীলন হিসাবে আমি বিশ্বাস করি কেবলমাত্র শেষটিই প্রস্তাবিত।


11

না, এটি প্রতিটি পদ্ধতিতে অ্যাক্সেস করার জন্য নয়, এটি একটি "রেজোলিউশন" অপারেটর, অর্থাৎ, আপনি এটি একটি ধ্রুবক / স্থির চিহ্নের সুযোগ (বা আপনি বলতে পারেন এমন অবস্থান) সমাধান করার জন্য ব্যবহার করেন।

উদাহরণস্বরূপ আপনার লাইনের প্রথম অংশে, রেলগুলি এটি অ্যাক্টিভেকর্ডের মধ্যে ভিত্তি শ্রেণিটি সন্ধান করতে ব্যবহার করে odমডুল, আপনার দ্বিতীয়টিতে এটি রুট শ্রেণির শ্রেণি পদ্ধতি (স্ট্যাটিক) ইত্যাদি সনাক্ত করতে ব্যবহৃত হয় etc.

এটি কোনও কিছু প্রকাশ করার জন্য ব্যবহৃত হয় না, এটি আপনার স্কোপগুলির চারপাশে স্টাফ "সনাক্ত" করতে ব্যবহৃত হয়।

http://en.wikipedia.org/wiki/Scope_resolution_operator


"(স্থিতিশীল)" দ্বারা আপনি কি "(অঙ্কন)" বলতে চাচ্ছেন?!?!
মেলতেমি

8

আশ্চর্যজনকভাবে, এখানে সমস্ত 10 টি উত্তর একই জিনিস বলে। '::' একটি নেমস্পেস রেজোলিউশন অপারেটর এবং হ্যাঁ এটি সত্য। তবে ধীরে ধীরে অনুসন্ধানের অ্যালগরিদমের ক্ষেত্রে নেমস্পেস রেজোলিউশন অপারেটরটি সম্পর্কে আপনাকে উপলব্ধি করতে হবে । যেমন ম্যাটজ তাঁর 'দ্য রুবি প্রোগ্রামিং ল্যাঙ্গুয়েজ' বইটিতে বর্ণনা করেছেন, ধ্রুবক অনুসন্ধানের একাধিক পদক্ষেপ রয়েছে। প্রথমত, এটি লেজিকাল স্কোপটিতে ধ্রুবককে অনুসন্ধান করে যেখানে ধ্রুবকটি রেফারেন্স করা হয়। যদি এটি লেজিকাল স্কোপের মধ্যে ধ্রুবকটি খুঁজে না পায়, তবে এটি উত্তরাধিকারের শ্রেণিবিন্যাস অনুসন্ধান করে । এই ধ্রুবত অনুসন্ধান অ্যালগরিদমের কারণে, নীচে আমরা প্রত্যাশিত ফলাফলগুলি পেয়েছি:

module A
  module B
      PI = 3.14
      module C
        class E
          PI = 3.15
        end
        class F < E
          def get_pi
            puts PI
          end
        end
      end
  end
end
f = A::B::C::F.new
f.get_pi
> 3.14

এফ থেকে ই এর উত্তরাধিকার সূত্রে, বি মডিউলটি এফ এর লিক্সিকাল স্কোপের মধ্যে রয়েছে ফলস্বরূপ, এফ দৃষ্টান্তগুলি মডিউল বিতে সংজ্ঞায়িত ধ্রুবক পিআই উল্লেখ করবে এখন যদি মডিউল বি পিআইকে সংজ্ঞায়িত না করে, তবে এফ দৃষ্টান্তগুলি পিআইকে নির্দেশ করবে ধ্রুবক সুপারক্লাস ই সংজ্ঞায়িত।

তবে যদি আমরা '::' বাসা বাঁধার মডিউলগুলির পরিবর্তে ব্যবহার করি? আমরা কি একই ফলাফল পেতে পারি? না!

নেস্টেড মডিউলগুলি সংজ্ঞায়িত করার সময় নেমস্পেস রেজোলিউশন অপারেটরটি ব্যবহার করে, নেস্টেড মডিউলগুলি এবং ক্লাসগুলি আর তাদের বাহ্যিক মডিউলগুলির লেজিকাল স্কোপের মধ্যে নেই। আপনি নীচে দেখতে পাচ্ছেন, A :: B এ সংজ্ঞায়িত পিআই A :: B :: C :: D এর লেজিকাল স্কোপে নেই এবং এইভাবে get_pi উদাহরণ পদ্ধতিতে পিআইকে উল্লেখ করার চেষ্টা করার সময় আমরা অবিচ্ছিন্ন ধ্রুব পেতে পারি:

module A
end

module A::B
  PI = 3.14
end

module A::B::C
  class D
    def get_pi
      puts PI
    end
  end
end
d = A::B::C::D.new
d.get_pi
NameError: uninitialized constant A::B::C::D::PI
Did you mean?  A::B::PI

4

আপনার প্রকল্পের সাথে সংযুক্ত অন্যান্য কোডের সংঘর্ষ থেকে সংজ্ঞাগুলি রোধ করার বিষয়ে এটিই রয়েছে। এর অর্থ আপনি জিনিসগুলি আলাদা রাখতে পারবেন।

উদাহরণস্বরূপ আপনার কোডে আপনার "রান" নামে একটি পদ্ধতি থাকতে পারে এবং আপনি এখনও লিঙ্কযুক্ত কিছু অন্যান্য লাইব্রেরিতে সংজ্ঞায়িত "রান" পদ্ধতির পরিবর্তে আপনার পদ্ধতিটি কল করতে সক্ষম হবেন।


3
module Amimal
      module Herbivorous
            EATER="plants" 
      end
end

Amimal::Herbivorous::EATER => "plants"

:: একটি সুযোগ তৈরি করতে ব্যবহৃত হয়। 2 মডিউল থেকে কনস্ট্যান্ট EATER অ্যাক্সেস করার জন্য আমাদের ধ্রুবক পর্যন্ত পৌঁছানোর জন্য মডিউলগুলি স্কোপ করতে হবে


3

রেলপথে রুবি ::নেমস্পেস রেজোলিউশন ব্যবহার করে ।

class User < ActiveRecord::Base

  VIDEOS_COUNT = 10
  Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"}

end

এটি ব্যবহার করতে:

User::VIDEOS_COUNT
User::Languages
User::Languages.values_at("Spanish") => "en"

এছাড়াও, অন্যান্য ব্যবহারগুলি হ'ল: নেস্টেড রুটগুলি ব্যবহার করার সময়

OmniauthCallbacksController ব্যবহারকারীদের অধীনে সংজ্ঞায়িত করা হয়।

এবং রুট করা হয়েছে:

devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"}


class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

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