Class와 Klass의 차이점은 무엇입니까?
klass
에서와 같이 Class
객체 를 보유하는 변수의 이름을 지정하는 데 일반적으로 사용됩니다 (클래스도 객체 임을 기억하십시오) klass = String
. 더 깊은 설명을 위해 본 위치의 출처를 제공 할 수 있습니까?
clazz
은 klass
(예를 들어 "Metaprogramming Ruby"라는 책에서) 대신 사용 합니다.
Class와 Klass의 차이점은 무엇입니까?
klass
에서와 같이 Class
객체 를 보유하는 변수의 이름을 지정하는 데 일반적으로 사용됩니다 (클래스도 객체 임을 기억하십시오) klass = String
. 더 깊은 설명을 위해 본 위치의 출처를 제공 할 수 있습니까?
clazz
은 klass
(예를 들어 "Metaprogramming Ruby"라는 책에서) 대신 사용 합니다.
답변:
class
새 클래스를 정의하는 데 사용되는 키워드입니다. 예약 된 키워드이므로 변수 이름으로 사용할 수 없습니다. Ruby의 키워드를 변수 이름으로 사용할 수 없으므로 def
또는 module
또는 if
또는 end
등 이라는 이름의 변수를 가질 수 class
없습니다. 다르지 않습니다.
예를 들어 다음을 고려하십시오.
def show_methods(class)
puts Object.const_get(class).methods.inspect
end
show_methods "Kernel"
이를 실행하려고 class
하면 변수 이름으로 사용할 수 없기 때문에 오류가 발생 합니다.
test.rb:1: syntax error, unexpected kCLASS, expecting ')'
def show_methods(class)
^
test.rb:2: syntax error, unexpected ')'
puts Object.const_get(class).methods.inspect
이 문제를 해결하기 위해 klass
대신 식별자 를 사용합니다 . 특별하지는 않지만 일반적으로 클래스 또는 클래스 이름을 다룰 때 변수 이름으로 사용됩니다. 소리 나는대로 동일하지만 예약 된 키워드가 아니기 때문에 Ruby는 문제가 없습니다.
def show_methods(klass)
puts Object.const_get(klass).methods.inspect
end
show_methods "Kernel"
예상대로 출력은 다음과 같습니다.
["method", "inspect", "name", "public_class_method", "chop!"...
거기에서 (예약되지 않은) 변수 이름을 사용할 수 있지만 커뮤니티는 klass
. 특별한 마법이 없습니다. 단지 "여기서 'class'라는 이름을 사용하고 싶었지만 예약어라서 사용할 수 없습니다."라는 뜻입니다.
참고로, 몇 번 잘못 입력 했으므로 Ruby에서는 대소 문자가 중요하다는 점에 주목할 가치가 있습니다. 대문자로 시작하는 토큰은 상수입니다. 곡괭이를 통해 :
상수 이름은 대문자와 이름 문자로 시작합니다. 클래스 이름과 모듈 이름은 상수이며 상수 명명 규칙을 따릅니다. 관례 적으로 상수 변수는 일반적으로 대문자와 밑줄을 사용하여 철자를 사용합니다.
따라서 올바른 철자는 class
and klass
가 아니라 Class
and Klass
입니다. 후자는 상수, 그리고 둘 것 Class
및 Klass
유효한 상수 이름입니다,하지만 난 명확성을 위해 그들을 사용에 대해 추천 할 것입니다.
Class
특히 유효한 상수 이름 일뿐만 아니라 현존하는 이름이기도합니다! (클래스 클래스)
klass
지역 변수로서의 사용은 Pickaxe에서 비롯된 것이라고 생각합니다 . 여기에서 설명한 이유와 정확히 일치하는 몇 가지 예에서 해당 이름을 사용했습니다.
object_instance.class.name == 'Object'
klass
Rails (또는 ActiveRecord) 메서드 이기도합니다 . 연관 클래스를 가져 오는 데 사용됩니다.
링크 된 내용에 명시된대로 :
class Author < ActiveRecord::Base
has_many :books
end
Author.reflect_on_association(:books).klass
# => Book
하나는 클래스의 이름이고 다른 하나는 기본적으로 정의되지 않은 상수입니다. 그리고 당신이 볼 가능성이 높아 쌍을 위해, class
그리고 klass
후자는 단지 식별자 (문자 다른 문자열처럼) 동안, 전자는 클래스를 정의하는 키워드입니다. "class"라는 단어를 쓰고 싶을 때 사용되지만 예약어이기 때문에 사용할 수 없습니다.
class = Kernel.const_get(class_name)
. 그러나 당신은 작성할 수 klass = Kernel.const_get(class_name)
있으며, 그것은 "클래스"를 나타내는 데 사용됩니다.
Klass
대문자로 시작하는 식별자는 상수이므로 한 번만 설정할 수 있으므로 for를 사용 하는 것은 좋지 않은 선택입니다. 그러나 네, 그것이 일반적인 생각입니다.