2

在 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 中实现这一目标?

4

3 回答 3

6

在 Crystal中,现在 Ruby 中没有 eigenclass,或者更常称为单例类(假设有Object#singleton_class)。

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

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

  declarative_method_name
end

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

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

于 2016-07-04T09:28:12.933 回答
0

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

class Foo
  private self.new; end
end
class Bar < Foo
end
Bar.new #=> error: private method 'new' called for Foo:Class
于 2016-10-30T02:53:01.037 回答
0

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

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

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

于 2021-02-04T12:50:44.127 回答