如何在 Crystal 中访问对象的特征类?

How do I access an object's eigenclass in Crystal?

在 Ruby 中,可以通过重新打开对象来访问对象的特征类(或 "singleton class")。这对于定义 "private class methods":

特别有用
class Foo
  class << self
    private
    def declarative_method_name
    end
  end

  declarative_method_name
end

# Foo.declarative_method_name => ERROR!

但是,在 Crystal 中,这不是语法:

Syntax error in ./test.cr:2: expecting token 'CONST', not '<<'

  class << self
        ^

目前 Crystal 是否有其他(或任何)方法来实现此目的?

现在 Ruby 中没有特征值 class,或者更常见的称为单例 class(假设有 Object#singleton_class),Crystal。

但是支持定义 class 方法并在 class 级别调用它们:

class Foo
  private def self.declarative_method_name
    puts "hey"
  end

  declarative_method_name
end

https://carc.in/#/r/1316

此处的 def self. 构造由编译器特化,其下没有更通用的概念。

如何将超级 类' 的新方法私有化,同时仍然允许其子类' 成为 public?

class Foo
  private self.new; end
end
class Bar < Foo
end
Bar.new #=> error: private method 'new' called for Foo:Class

这里还值得注意的是,与 Ruby 不同,class 变量不超越继承。在 Ruby 下面的代码有一个奇怪的副作用...

class Foo
  @@var = 'foo'
  def var
    @@var
  end
end
class Bar < Foo
  @@var = 'bar'
end
puts Foo.new.var

它将 return 'bar' 尽管我们修改了 Bar 上的 class 变量。在 crystal 中,它 returns 'foo' 意味着我们访问 eiganclass 以安全地存储和读取 class 级别状态的另一个原因不是crystal 中必需的,我们可以只使用 class 个变量。