Ruby 求教,怎么能让 Class 可以访问和修改 modul 的变量?

geniusfox · 2021年10月28日 · 最后由 geniusfox 回复于 2021年11月04日 · 390 次阅读
#!/bin/ruby

module Pipline
    class << self
        attr_accessor :seg_column_name
    end
    self.seg_column_name = 'X'
end

class A 
    include Pipline
    self.seg_column_name ='a'
end

class B
    include Pipline
    self.seg_column_name ='b'
end

我期望是可以让类 A 和 B 都可以设置自己的 column_name, Pipline.seg_column_name => 'X' A.seg_column_name =>'a' B.seg_column_name =>'b'

但实际是 Traceback (most recent call last): 5: from /Users/zhouqiang/.rvm/rubies/ruby-2.7.2/bin/irb:23:in <main>' 4: from /Users/zhouqiang/.rvm/rubies/ruby-2.7.2/bin/irb:23:inload' 3: from /Users/zhouqiang/.rvm/rubies/ruby-2.7.2/lib/ruby/gems/2.7.0/gems/irb-1.2.6/exe/irb:11:in <top (required)>' 2: from (irb):9 1: from (irb):11:inclass:A' NoMethodError (undefined method `seg_column_name=' for A:Class)

求教,如果为了实现我的这个目标,应该怎么改?

module Pipline
    extend self
    attr_accessor :seg_column_name
    self.seg_column_name = 'X'
end

class A 
    extend Pipline
    self.seg_column_name ='a'
end

改成这样就好了,要混入类方法用 extend

这个我怎么运行出错? module:Pipline': undefined method `seg_column_name=' for Pipline:Module (NoMethodError)

module Pipline
  def self.included(base)
    class << base
      attr_accessor :seg_column_name
    end
  end
end

class A
  include Pipline
  self.seg_column_name ='a'
end
geniusfox 回复

Pipline 加入一行 extend self 就可以了

我发现用 ActiveSuppor 的包能解决我的问题

module EtlPipline
  extend ActiveSupport::Concern
  attr_accessor :seg_name
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号