루비에서 클래스와 클라스의 차이점은 무엇입니까?


112

Class와 Klass의 차이점은 무엇입니까?


1
후자를 어디에서 보았습니까?
Darin Dimitrov

18
klass에서와 같이 Class객체 를 보유하는 변수의 이름을 지정하는 데 일반적으로 사용됩니다 (클래스도 객체 임을 기억하십시오) klass = String. 더 깊은 설명을 위해 본 위치의 출처를 제공 할 수 있습니까?
Chubas 2011

5
아니요, 그렇게 설명하고 싶지 않기 때문에 단일 소스를 제공하고 싶지 않습니다. 나는 이것에 대해 더 큰 그림을 원한다
thenengah

5
때때로 사람들 clazzklass(예를 들어 "Metaprogramming Ruby"라는 책에서) 대신 사용 합니다.
Andrew Grimm

2
TV Tropes에서는이를 "Xtreme Kool Letterz"라고 부릅니다 (링크 없음-생산성에 안전하지 않음).
Andrew Grimm

답변:


188

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입니다. 후자는 상수, 그리고 둘 것 ClassKlass유효한 상수 이름입니다,하지만 난 명확성을 위해 그들을 사용에 대해 추천 할 것입니다.


7
글쎄, Class특히 유효한 상수 이름 일뿐만 아니라 현존하는 이름이기도합니다! (클래스 클래스)
Asherah

1
우와 아름답다. 이제 완전히 이해하십시오. 고마워 크리스! :)
thenengah 2010

1
klass지역 변수로서의 사용은 Pickaxe에서 비롯된 것이라고 생각합니다 . 여기에서 설명한 이유와 정확히 일치하는 몇 가지 예에서 해당 이름을 사용했습니다.
Ken Bloom

이전 루비 버전을 적용해야합니다. Ruby 1.9.3과 함께 사용object_instance.class.name == 'Object'
Augustin Riedinger 2015-06-25

아니요, 여전히 정확합니다. Object.new의 클래스는 Object이지만 Object의 클래스는 Class입니다.
Chris Heald

22

klassRails (또는 ActiveRecord) 메서드 이기도합니다 . 연관 클래스를 가져 오는 데 사용됩니다.

링크 된 내용에 명시된대로 :

class Author < ActiveRecord::Base
  has_many :books
end

Author.reflect_on_association(:books).klass
# => Book

12

klassclazzclasz은 예약어를 돌아 다니는 데 사용되는 창의적인 맞춤법 오류 class입니다.

그것은 사용하기 위해 눈에 거슬리는 훨씬 적은 것 class1또는 cl또는 classX의도적으로 맞춤법보다는 또는 무언가를.


5

하나는 클래스의 이름이고 다른 하나는 기본적으로 정의되지 않은 상수입니다. 그리고 당신이 볼 가능성이 높아 쌍을 위해, class그리고 klass후자는 단지 식별자 (문자 다른 문자열처럼) 동안, 전자는 클래스를 정의하는 키워드입니다. "class"라는 단어를 쓰고 싶을 때 사용되지만 예약어이기 때문에 사용할 수 없습니다.


요점은 무엇이며, 왜 / 어떻게 사용하는지, 일반적으로 무엇을 위해 사용됩니까?
thenengah

3
@Sam 클래스는 클래스 정의를위한 예약 된 키워드입니다. 따라서 메타 프로그래밍과 같은 제네릭 클래스를 다루고 싶다면 class = Kernel.const_get(class_name). 그러나 당신은 작성할 수 klass = Kernel.const_get(class_name)있으며, 그것은 "클래스"를 나타내는 데 사용됩니다.
Thiago Silveira

2
요점은 'class'를 의미하기 위해 'class'라는 키워드를 사용할 수 없다는 것입니다. 그것은 예약어이기 때문에 (순환 논리, 알고 있습니다) 대신 'klass'라는 단어가 대체됩니다. 이것은 Java 및 C #과 같은 다른 많은 언어에서 일반적인 관용구입니다.
Scott

클래스를 동적으로 할당 할 수 있습니까? Klass = object.class; Klass.new - 그런 일
thenengah

3
@Sam : Klass대문자로 시작하는 식별자는 상수이므로 한 번만 설정할 수 있으므로 for를 사용 하는 것은 좋지 않은 선택입니다. 그러나 네, 그것이 일반적인 생각입니다.
Chuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.