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에서는 대소 문자가 중요하다는 점에 주목할 가치가 있습니다. 대문자로 시작하는 토큰은 상수입니다. 곡괭이를 통해 :
상수 이름은 대문자와 이름 문자로 시작합니다. 클래스 이름과 모듈 이름은 상수이며 상수 명명 규칙을 따릅니다. 관례 적으로 상수 변수는 일반적으로 대문자와 밑줄을 사용하여 철자를 사용합니다.
따라서 올바른 철자는 classand klass가 아니라 Classand Klass입니다. 후자는 상수, 그리고 둘 것 Class및 Klass유효한 상수 이름입니다,하지만 난 명확성을 위해 그들을 사용에 대해 추천 할 것입니다.
Class특히 유효한 상수 이름 일뿐만 아니라 현존하는 이름이기도합니다! (클래스 클래스)
klass지역 변수로서의 사용은 Pickaxe에서 비롯된 것이라고 생각합니다 . 여기에서 설명한 이유와 정확히 일치하는 몇 가지 예에서 해당 이름을 사용했습니다.
object_instance.class.name == 'Object'
klassRails (또는 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를 사용 하는 것은 좋지 않은 선택입니다. 그러나 네, 그것이 일반적인 생각입니다.