Ruby 这样的类要什么实现,请指点

kingwkb · 2013年05月10日 · 最后由 doitian 回复于 2013年05月10日 · 2557 次阅读

我现在这样用

class A
  class << self

    attr_accessor :username, :password

    def fun
      # username
    end
  end

我想在外部配置 username,和 password

比如在 initializer 目录里面放一个文件,里面写

A.username = 'xxxx' A.password = 'xxxx'

我在 A.fun 里面取不到设置的值

我想这样用,应该如何实现 A 呢?

class A
   cattr_accessor :username, :abc
    class << self
      def fun
        username.
      end
    end
  end

#1 楼 @kevinxu

这样可以,谢谢

我粘贴到 irb 都能取到。。你是不是没重启 server?

#4 楼 @jjym 确实重启 server 就可以了,有大牛出来解释解释吗

#6 楼 @kingwkb 。。initializer 本来就是只在 rails 启动时才执行的。。

#6 楼 @kingwkb initializer 只有启动时候才加载一次 你可以改了源码 然后进 concole 做一次赋值 然后就能看到结果了 不过这样的写法不推荐 不如写成 config 以后项目大了好维护

#7 楼 @jjym #8 楼 @zj0713001 我是想知道在本例中使用 attr_accessor 和 cattr_accessor 的细节不同

#9 楼 @kingwkb cattr_accessor 内部用的 @@var,所有继承自这个类的后代,以及从这个类和后代初始化的对象共享一个实例。简单说,如果子类用 var= 修改了,父类的 var 的返回值也变了。

#11 楼 @doitian 而在 class << self block 里用 attr_accessor 用的 class 的 instance variable。子类拥有自己的拷贝。子类的修改不影响父类。子类在声明时,也不会从父类继承当前的值。所以子类必须自己初始化。

但很多时候又想继承值,但在子类修改的时候不影响父类(写时拷贝),于是 Rails 又捣腾出个 class_attribute (旧称 class_inheritable_accessor)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号