【问题标题】:Share data between methods在方法之间共享数据
【发布时间】:2018-03-25 20:51:07
【问题描述】:

我有这个模块,它被包含在一个类中:

module MyModule

    def self.included base
        base.extend ClassMethods
    end

    module ClassMethods
        def my_module_method data
            include MyModule::InstanceMethods

            after_save :my_module_process

            attr_accessor :shared_data
            shared_data = data
            # instance_variable_set :@shared_data, data
        end
    end

    module InstanceMethods

        private

        def my_module_process
            raise self.shared_data.inspect
            # raise instance_variable_get(:@shared_data).inspect
        end

    end

end

我想在my_module_process 中使用传递给my_module_methoddata(参数)。我使用了attr_accessor 以及实例变量,但它们中的任何一个都返回nil

【问题讨论】:

  • 在将逻辑提取到模块中之前,您认为是否值得先在课堂上做?在你开始包含和扩展之前,我认为退后一步并在课程的上下文中查看这些内容是明智的。截至目前,它必须说明您想要实现的目标。

标签: ruby-on-rails ruby instance-variables attr-accessor


【解决方案1】:

由于您使用的是 rails,因此可以通过将其设置为 AS::Concern 来大大简化您的模块

module MyModule
  extend ActiveSupport::Concern

  included do
    # after_save :my_module_process # or whatever
    cattr_accessor :shared_data
  end

  module ClassMethods
    def my_module_method(data)
      self.shared_data = data
    end
  end

  def my_module_process
    "I got this shared data: #{self.class.shared_data}"
  end
end

这里的重点是:

  • cattr_accessor,类似于attr_accessor,但定义了类级别的方法
  • self.class.shared_data 从实例中访问该类级别的数据。

用法:

class Foo
  include MyModule
end

f = Foo.new
f.my_module_process # => "I got this shared data: "
Foo.my_module_method({foo: 'bar'})
f.my_module_process # => "I got this shared data: {:foo=>\"bar\"}"

我使用了 attr_accessor 和实例变量,但它们都返回 nil。

在 ruby​​ 中,在任何特定时刻了解self 是非常重要的。这就是定义可供您使用的方法和实例变量的内容。作为练习,我让您了解为什么 user.name 在此处返回 nil(以及如何解决它)。

class User
  @name = 'Joe'

  def name
    @name
  end
end

user = User.new
user.name # => nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2011-01-13
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多