Как установить переменные экземпляра из лямбда-определения при определении в другой области видимости - PullRequest
1 голос
/ 04 октября 2019

У меня есть модуль с несколькими методами, и я хочу, чтобы некоторые из них оставались закрытыми. Поскольку вы не можете пометить их как закрытые в модуле, я хотел извлечь реализацию во вложенный класс и делегировать вызовы этому классу.

У меня возникла проблема с установкой переменных экземпляра. Отрезанный код работает так, как и следовало ожидать для инициализации значения @id, но он не работает для @token.

. Есть ли возможность вызвать метод HelpersImpl#token_initializer из модуля Helpers, который установит @token значение для него?

И второй вопрос: почему это работает, когда метод, который устанавливает переменные, определен в Helpers, но не работает, когда определен в HelpersImpl?

module Helpers
  def init_token
    HelpersImpl.new.token_initializer.call
  end

  def init_id
    id_initializer.call
  end

  def id_initializer
    lambda do
      @id = 'id'
    end
  end

  class HelpersImpl
    def token_initializer
      lambda do
        @token = 'HelpersImpl'
      end
    end
  end

  private_constant :HelpersImpl
end

class User
  include Helpers

  def token
    init_token
    @token
  end

  def id
    init_id
    @id
  end
end

user = User.new

if user.id == 'id'
  puts 'Id - OK!'
else
  puts "Id - Wrong id: #{user.id.inspect}"
end

if user.token == 'HelpersImpl'
  puts 'Token - OK!'
else
  puts "Token - Wrong token: #{user.token.inspect}"
end

1 Ответ

1 голос
/ 04 октября 2019
  def init_token
    instance_exec(&HelpersImpl.new.token_initializer)
  end

instance_exec вызывает блок (или lambda / proc, если вы преобразуете его в блок с &), передавая значение вызывающего абонента self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...