Class和Klass in ruby​​有什么区别?


112

Class和Klass有什么区别?


1
您在哪里看到了后者?
达林·迪米特洛夫

18
klass通常用于命名包含Class对象的变量(请记住类也是对象),如中所示klass = String。您能否提供您所见之处的来源,以进行更深入的说明?
Chubas

5
不,我不想提供单一来源,因为我不想这样解释。我希望对此有一个更大的了解
thenengah 2010年

5
有时,人们使用clazz而不是klass(例如,在“ Metaprogramming Ruby”一书中)。
安德鲁·格林

2
在TV Tropes中,这称为“ Xtreme Kool Letterz”(无链接-不能保证生产力)。
安德鲁·格林

Answers:


188

class是用于定义新类的关键字。由于它是保留关键字,因此您不能将其用作变量名。您不能将Ruby的任何关键字用作变量名,因此您将无法拥有名为defor moduleifor的变量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 2010年

1
哇好漂亮。现在完全了解。谢谢克里斯!:)
thenengah 2010年

1
我认为使用klassas作为局部变量来自镐-他们在几个示例中使用了该名称,正是出于您在此描述的原因。
肯·布鲁姆

这必须应用旧的红宝石版本。在Ruby 1.9.3中,我使用object_instance.class.name == 'Object'
Augustin Riedinger,2015年

不,它仍然准确。Object.new的类是Object,但是Object的类是Class。
克里斯·希尔德

22

klass还是Rails(或ActiveRecord)方法。它用于获取关联的类。

如链接内容中所述:

class Author < ActiveRecord::Base
  has_many :books
end

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

12

klassclazzclasz等是用于绕过保留字的创造性拼写错误class

这将是远不如不和谐的眼睛使用class1clclassX或东西,而不是故意拼写错误。


5

一个是类的名称,另一个是默认情况下未定义的常量。对于这对,您更有可能看到classklass,前者是用于定义类的关键字,而后者只是一个标识符(与其他任何字符串一样)。当您想写“类”一词时使用它,但不能,因为它是保留关键字。


有什么意义,我是说为什么/如何使用它,通常用于什么用途?
thenengah

3
@Sam class是用于定义类的保留关键字。因此,如果您想使用通用类(例如元编程)来处理某些事情,则不能编写class = Kernel.const_get(class_name)。但是您可以编写klass = Kernel.const_get(class_name),它用来表示“类”。
Thiago Silveira 2010年

2
关键是您不能使用关键字“ class”来表示“ class”……因为它是保留字(我知道是循环逻辑),所以用“ klass”一词代替。这是许多其他语言(例如Java和C#)中的常见用法。
Scott

这样就可以动态分配班级?克拉斯= object.class; Klass.new-类似的东西
thenengah 2010年

3
@Sam:使用Klass该选项将是一个糟糕的选择,因为以大写字母开头的标识符是常量,因此只能设置一次。但是,是的,这是普遍的想法。
Chuck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.