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