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

时间:2016-07-04 07:17:20

标签: crystal-lang

在Ruby中,可以通过重新打开来访问对象的本征类(或“单例类”)。这对于定义“私有类方法”特别有用:

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中实现此目的的方法吗?

3 个答案:

答案 0 :(得分:5)

目前在Ruby中没有本征类,或者更常见的称为单例类(在那里给出了Object#singleton_class),在Crystal中。

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

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

  declarative_method_name
end

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

这里的def self.构造是由编译器专门设计的,并且它下面没有更一般的概念。

答案 1 :(得分:0)

如何将超类的新方法设为私有,同时仍允许其子类'公开?

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

答案 2 :(得分:0)

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

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

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