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 でシングルトン クラスと呼ばれるものはありません (あると仮定すると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 に答える