Частные методы модуля в Ruby

99
задан Eric Platon 12 February 2014 в 01:52
поделиться

4 ответа

Я думаю лучший способ (и главным образом как существующий освобождает, записаны), делают это путем создания класса в модуле, который имеет дело со всей логикой, и модуль просто предоставляет удобный метод, например,

module GTranslate
  class Translator
    def perform( text ); 'hola munda'; end
  end

  def self.translate( text )
    t = Translator.new
    t.perform( text )
  end
end
85
ответ дан Nakilon 24 November 2019 в 04:59
поделиться

Существует также Module.private_class_method, который возможно выражает более полный решимости.

module Foo
  def self.included(base)
    base.instance_eval do
      def method_name
        # ...
      end
      private_class_method :method_name
    end
  end
end

Для кода в вопросе:

module Thing
  def self.pub; puts "Public method"; end
  def self.priv; puts "Private method"; end
  private_class_method :priv
end

Ruby 2.1 или более новый:

module Thing
  def self.pub; puts "Public method"; end
  private_class_method def self.priv; puts "Private method"; end
end
75
ответ дан konsolebox 24 November 2019 в 04:59
поделиться

Можно использовать "включенный" метод, чтобы сделать необычные вещи, когда модуль смешан в. Это делает, о каком Вы хотите, я думаю:

module Foo
  def self.included(base)
    class << base 
      def public_method
        puts "public method"
      end
      def call_private
        private_method
      end
      private
      def private_method
        puts "private"
      end
    end
  end
end

class Bar
  include Foo
end

Bar.public_method

begin
  Bar.private_method
rescue
  puts "couldn't call private method"
end

Bar.call_private
28
ответ дан Cameron Price 24 November 2019 в 04:59
поделиться

К сожалению, private только относится к методам экземпляра. Общий способ получить частные "статические" методы в классе состоит в том, чтобы сделать что-то как:

class << self
  private

  def foo()
   ....
  end
end

По общему признанию я не играл с выполнением этого в модулях.

12
ответ дан J Cooper 24 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: