红宝石中Class和Klass有什么区别?

时间:2010-11-28 21:49:09

标签: ruby class

Class和Klass有什么区别?

4 个答案:

答案 0 :(得分:176)

class是用于定义新类的关键字。由于它是保留关键字,因此您无法将其用作变量名称。您不能将任何Ruby的关键字用作变量名,因此您将无法拥有名为defmoduleifend等的变量 - 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中,案例很重要。以大写字母开头的标记是常量。通过Pickaxe

  

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

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

答案 1 :(得分:17)

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

如链接内容所述:

class Author < ActiveRecord::Base
  has_many :books
end

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

答案 2 :(得分:11)

klass以及clazzclasz等是用于绕过保留字class的创意拼写错误。

使用class1clclassX或其他东西而不是故意拼写错误,对眼睛的影响要小得多。

答案 3 :(得分:5)

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