Ответ 1
Прежде всего, static
на самом деле не является частью жаргона Ruby.
Возьмем простой пример:
class Bar
def self.foo
end
end
Он определяет метод foo
для явного объекта self
, который в этой области возвращает класс Bar
.
Да, его можно определить методом класса, но статический не имеет смысла в Ruby.
Тогда private
не будет работать, поскольку определение метода на явном объекте (например, def self.foo
) обходит квалификаторы доступа и делает этот метод общедоступным.
Что вы можете сделать, это использовать синтаксис class << self
для открытия метакласса содержащего класса и определить методы там как методы экземпляра:
class Foo
class << self
def bar
do_calc
end
def baz
do_calc
end
private
def do_calc
puts "calculating..."
end
end
end
Это даст вам то, что вам нужно:
Foo.bar
calculating...
Foo.baz
calculating...
Foo.do_calc
NoMethodError: private method `do_calc' called for Foo:Class