ruby中类和Klass的区别是什么?

ruby中类和Klass的区别是什么?,ruby,class,Ruby,Class,类和Klass之间的区别是什么?一个是类的名称,另一个默认情况下只是一个未定义的常量。对于您更可能看到的一对,class和klass,前者是定义类的关键字,而后者只是标识符(与任何其他字符串一样)。当您想编写单词“class”但由于它是保留关键字而无法编写时,可以使用它。class是用于定义新类的关键字。因为它是一个保留关键字,所以不能将其用作变量名。您不能使用Ruby的任何关键字作为变量名,因此您将无法将变量命名为def或module或,如果或end等-类也一样 例如,考虑以下内容: def

类和Klass之间的区别是什么?

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

class
是用于定义新类的关键字。因为它是一个保留关键字,所以不能将其用作变量名。您不能使用Ruby的任何关键字作为变量名,因此您将无法将变量命名为
def
module
,如果
end
等-
也一样

例如,考虑以下内容:

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中,case很重要。以大写字母开头的标记是常量。通过:

常量名称以大写字母开头,后跟名称字符。类名和模块名是常量,并遵循常量命名约定。按照惯例,常量变量通常使用大写字母和下划线拼写


因此,正确的拼写是
class
klass
,而不是
class
klass
。后者是常量,
Class
Klass
都是有效的常量名称,但为了清晰起见,我建议不要使用它们。

Klass
clazz
clasz
等都是用于绕过保留字
Class
的创造性拼写错误


使用
class1
cl
classX
或其他东西,而不是故意拼错,对眼睛的刺激要小得多。

klass
也是Rails(或者更确切地说是ActiveRecord)。它用于获取关联的类

如链接内容所述:

class Author < ActiveRecord::Base
  has_many :books
end

Author.reflect_on_association(:books).klass
# => Book
类作者
您在哪里看到了后者?
klass
通常用于命名包含
Class
对象的变量(记住类也是对象),如
klass=String
中所示。你能提供你在哪里看到它的来源以作更深入的解释吗?不,我不想提供一个来源,因为我不想这样解释。我想对此有一个更大的了解有时候,人们使用
clazz
而不是
klass
(例如,在《元编程Ruby》一书中)。在电视比喻中,这被称为“Xtreme Kool Letterz”(无链接-不安全)。重点是什么,我的意思是为什么/如何使用它,它通常用于什么?@Sam class是定义类的保留关键字。因此,如果要处理泛型类(如元编程),就不能编写
class=Kernel.const\u get(class\u name)
。但是你可以写
klass=Kernel.const\u get(class\u name)
,它用来表示“class”。关键是你不能用关键字“class”来表示“class”。。。因为它是一个保留字(循环逻辑,我知道),所以用“klass”代替。这是许多其他语言中的常见习惯用法,例如Java和C#。所以您可以动态分配类?Klass=object.class;克拉斯,新的,类似的that@Sam:使用
Klass
进行设置是一个糟糕的选择,因为以大写字母开头的标识符是常量,所以只能设置一次。但是,是的,这是一般的想法。
Class
不仅是一个有效的常量名,而且是一个现存的常量名!(这是班级)哇,真漂亮。现在完全明白了。谢谢你,克里斯!:)我认为
klass
作为局部变量的用法来自于鹤嘴锄——他们在几个例子中使用了这个名称,原因正是您在这里描述的。这必须应用旧的ruby版本。对于Ruby 1.9.3,我使用
object\u instance.class.name==“object”
No,它仍然是准确的。Object.new的类是Object,但Object的类是class。