【问题标题】:What is the difference between Class and Klass in ruby?ruby 中的 Class 和 Klass 有什么区别?
【发布时间】:2011-05-17 00:06:22
【问题描述】:

Class和Klass有什么区别?

【问题讨论】:

  • 你在哪里看到后者?
  • klass 通常用于命名包含Class 对象的变量(请记住,类也是对象),如klass = String。您能否提供您在哪里看到它的来源以获得更深入的解释?
  • 不,我不想提供单一来源,因为我不想这样解释。我想要一个更大的画面
  • 有时,人们使用clazz而不是klass(例如,在“元编程Ruby”一书中)。
  • 在 TV Tropes 中,这被称为“Xtreme Kool Letterz”(没有链接 - 不安全)。

标签: ruby class


【解决方案1】:

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 都是有效的常量名称,但为了清楚起见,我建议不要使用它们。

【讨论】:

  • 嗯,Class 不仅是一个有效的常量名,它也是一个现存的! (这是 Class 类)
  • 哇,漂亮。现在完全明白了。谢谢克里斯! :)
  • 我认为 klass 作为局部变量的用法来自 Pickaxe —— 他们在几个示例中使用了该名称,原因正是您在此处描述的。
  • 这必须应用旧的 ruby​​ 版本。对于 Ruby 1.9.3,我使用 object_instance.class.name == 'Object'
  • 不,它仍然是准确的。 Object.new的类是Object,而Object的类是Class。
【解决方案2】:

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

如链接内容所述:

class Author < ActiveRecord::Base
  has_many :books
end

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

【讨论】:

    【解决方案3】:

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

    使用class1clclassX 或其他什么而不是故意拼写错误会少得多。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 有什么意义,我的意思是为什么/如何使用它,它通常用于什么?
      • @Sam class 是定义类的保留关键字。所以如果你想处理泛型类的事情(比如元编程),你不能写class = Kernel.const_get(class_name)。但是你可以写klass = Kernel.const_get(class_name),那是用来表示“类”的。
      • 关键是你不能用关键字'class'来表示'class'...因为它是一个保留字(循环逻辑,我知道)所以'klass'这个词而是被替换。这是许多其他语言中的常见习语,例如Java 和 C#。
      • 所以你可以动态分配类?类 = object.class; Klass.new - 类似的东西
      • @Sam:使用Klass 将是一个糟糕的选择,因为以大写字母开头的标识符是常量,因此您只能设置一次。但是,是的,这是一般的想法。
      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多