常量与实例变量与实例方法

时间:2014-08-25 04:38:57

标签: ruby variables methods constants

我有一个基类A,其中包含一个公共方法,它与A的后代提供的数组一起工作。数组是:

  • 仅由基类A
  • 中定义的方法使用
  • 不变,但有些特殊情况会有所不同。

如何处理如此定义的问题的对象设计?我仍然不确定自己在哪里存储该数组,无论是在常量,实例变量还是实例方法中。请告诉我如何做到这一点。

1 个答案:

答案 0 :(得分:0)

上次我对一个女新手很邪恶。这一次,我会尽力做好。

方式一,使用常数:

A = Class.new

class B < A
  FOO = [ :hello, :world ] # this is your array
end

# Access different constants defined in different descendants is tricky, like this:

class A
  def foo_user
    puts self.class.const_get :FOO
  end
end

B.new.foo_user #=> [ :hello, :world ]

# Note theat you can't do this:

class A
  def foo_user
    puts FOO # this would look for FOO in A mother class only
  end
end

 B.new.foo_user #=> error

方式二,使用属于A:

的子类的实例变量
A = Class.new

class B < A
  @foo = [ "hello", "world" ]
end

# This way is more usable. I would go about it like this:

class A
  class << self
    attr_reader :foo     # defining a reader class method
  end

  def foo
    self.class.foo       # delegating foo calls on the instances to the class
  end

  def foo_user
    puts foo
  end
end

B.new.foo_user #=> [ :hello, :world ]

第三种方法,使用后代定义的实例方法:

A = Class.new

class B < A
  def foo
    [ "hello", "world" ]
  end
end

# This way is also usable.

class A
  def foo_user
    puts foo
  end
end

方式2(属于后代类的实例变量)和3(后代类定义的方法)之间的选择取决于值(数组)需要的灵活性。方式2最灵活,但方式3占用的代码更少。