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



在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中没有特征类,或者现在Ruby中更常见的称为单例类(考虑到有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.结构是由编译器专门指定的,在它下面还没有更一般的概念。

如何使一个超类的新方法私有,同时仍然允许它的子类是公共的?

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

这里还值得注意的是,与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中是不必要的,我们可以使用类变量。

相关内容

  • 没有找到相关文章

最新更新