programing

루비의 더블콜론::는?

batch 2023. 5. 31. 18:30
반응형

루비의 더블콜론::는?

쌍콜론은 무엇입니까?::예를 들면Foo::Bar.

정의를 찾았습니다.

::클래스 또는 모듈 내에서 정의된 상수, 인스턴스 메소드 및 클래스 메소드를 클래스 또는 모듈 외부에서 액세스할 수 있도록 하는 단항 연산자입니다.

범위)만?::뭔가를 폭로하기 위해?

::기본적으로 네임스페이스 확인 연산자입니다.모듈의 항목이나 클래스의 클래스 수준 항목에 액세스할 수 있습니다.예를 들어, 다음과 같은 설정이 있었다고 가정합니다.

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

당신은 액수다있니에 접속할 수 .CONSTANT에서 모듈외부로 표시됨SomeModule::InnerModule::MyClass::CONSTANT.

을 주지 된 인스턴스 메서드(클에정인메스스않다습니주영는지서향에드을턴의래된스▁defined)에 액세스하기 입니다. 다른 구문(점)을 사용하여 액세스하기 때문입니다..).

관련 참고:최상위 네임스페이스로 돌아가려면 다음을 수행하십시오. ::SomeModule – Benjamin Oakes

이 간단한 예는 다음과 같습니다.

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 에서 발췌

::다른 클래스 또는 모듈 내에 정의된 상수, 모듈 또는 클래스에 액세스할 수 있습니다.메서드 및 클래스 이름이 다른 작성자의 다른 클래스와 충돌하지 않도록 이름 공간을 제공하는 데 사용됩니다.

을 볼 때.ActiveRecord::Base레일즈에서 레일즈는 다음과 같은 것을 가지고 있다는 것을 의미합니다.

module ActiveRecord
  class Base
  end
end

를들어것, 는라예▁called라는 입니다.BaseActiveRecord그 다음에 다음과 같이 언급됩니다.ActiveRecord::Base 소스의 rb)(Rails 소스의 active record-n.n/lib/active_record/base.rb)에서 수 .

::의 일반적인 용도는 모듈에 정의된 상수에 액세스하는 것입니다.

module Math
  PI = 3.141 # ...
end

puts Math::PI

::연산자를 사용하면 개인 또는 보호된 메서드를 무시할 수 없습니다.

::를 사용하여 무언가를 노출할 수 있다면 범위(개인, 보호됨)가 무슨 소용이 있습니까?

루비에서는 모든 것이 노출되고 다른 곳에서 모든 것을 수정할 수 있습니다.

클래스가 "클래스 정의" 외부에서 변경될 수 있다는 사실이 걱정된다면, 루비는 아마도 당신에게 적합하지 않을 것입니다.

반면에, 만약 당신이 자바의 클래스가 폐쇄되는 것에 좌절한다면, 루비는 아마도 당신이 찾고 있는 것일 것입니다.

놀랍게도, 여기에 있는 10개의 답은 모두 같은 것을 말합니다.'::'은 네임스페이스 확인 연산자이며, 예, true입니다.그러나 상수 조회 알고리즘과 관련하여 네임스페이스 해상도 연산자에 대해 인식해야 하는 문제가 있습니다.Matz가 그의 책 'Ruby Programming Language'에서 묘사했듯이, 지속적인 검색은 여러 단계로 이루어져 있습니다.먼저, 상수가 참조되는 어휘 범위에서 상수를 검색합니다.어휘 범위 내에서 상수를 찾지 못하면 상속 계층을 검색합니다.이러한 상수 조회 알고리즘을 통해 다음과 같은 예상 결과를 얻을 수 있습니다.

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

F가 E로부터 상속되는 반면, B 모듈은 F의 어휘적 범위 내에 있습니다.따라서 F 인스턴스는 모듈 B에 정의된 상수 PI를 참조합니다.모듈 B가 PI를 정의하지 않은 경우 F 인스턴스는 슈퍼클래스 E에 정의된 PI 상수를 참조합니다.

하지만 모듈을 중첩하는 대신 '::'를 사용한다면 어떨까요?우리도 같은 결과를 얻을 수 있을까요?아니!

중첩된 모듈을 정의할 때 네임스페이스 확인 연산자를 사용하면 중첩된 모듈 및 클래스가 더 이상 외부 모듈의 어휘 범위 내에 있지 않습니다.아래에서 볼 수 있듯이, A::B에 정의된 PI는 A::의 어휘 범위에 속하지 않습니다.B::C::D이므로 get_pi 인스턴스 메서드에서 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

이전 답변에 추가하여, 사용할 수 있는 루비가 유효합니다.::인스턴스 메서드에 액세스합니다.다음은 모두 유효합니다.

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

모범 사례에 따르면 마지막 사례만 권장됩니다.

아니요, 모든 메소드에 액세스하는 것이 아니라 "분해능" 연산자입니다. 즉, 상수/정적 기호의 범위(또는 말할 수 있는 위치)를 확인하는 데 사용합니다.

예를 들어, 행의 첫 번째에서 레일즈는 활성 레코드 내에서 기본 클래스를 찾기 위해 이 클래스를 사용합니다.모듈, 두 번째 모듈에서는 경로 클래스 등의 클래스 메소드(정적)를 찾는 데 사용됩니다.

그것은 어떤 것도 노출시키는 데 사용되지 않고, 당신의 스코프 주변에 있는 것들을 "위치"하는데 사용됩니다.

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

는 Ruby on Rails를 합니다. »::네임스페이스 확인에 사용됩니다.

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

이는 정의가 프로젝트에 연결된 다른 코드와 충돌하는 것을 방지하기 위한 것입니다.그것은 당신이 사물을 분리할 수 있다는 것을 의미합니다.

예를 들어 코드에 "실행"이라는 메서드가 있을 수 있지만 연결된 다른 라이브러리에 정의된 "실행" 메서드가 아닌 메서드를 호출할 수 있습니다.

module Amimal
      module Herbivorous
            EATER="plants" 
      end
end

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

범위를 만드는 데 사용됩니다.2개의 모듈에서 상수 EATER에 액세스하려면 모듈의 범위를 조정하여 상수에 도달해야 합니다.

간단히 말해서 그것은 네임스페이스이고, 이제 네임스페이스는 모듈, 클래스, 함수 및 기타를 위한 컨테이너입니다. 또한 문제 이름 충돌을 해결하는 데 도움이 됩니다. 루비에서는 다음과 같은 모듈로 네임스페이스에 액세스할 수 있습니다.

module A
  class Article
     def Base
     end
  module B
  end
end

클래스 아티클에 액세스하기 위해 A::기사.경우에 따라 A::기사 <적용::Base 이 의미는 모듈 A의 아티클 클래스가 Application 모듈의 기본 클래스를 상속한다는 의미입니다.

이 실을 조금 되살리는 것.우리가 이 연산자의 '루비' 이름을 만들 수 있을까요? :: 우리가 스플랫, 스프레드, 해시 로켓 등을 가지고 있기 때문에 우리가 아직 없다는 것에 놀랐습니다.

확실히 우리는 '더블 콜론'이나 '단일 연산자'보다 더 재미있는 것을 생각해 낼 수 있습니다.

생각중

  • 사분의
  • 네 눈
  • 테트라 도트
  • 니블(반 바이트 - 4비트)

언급URL : https://stackoverflow.com/questions/3009477/what-is-rubys-double-colon

반응형