有条件地覆盖实例属性

时间:2015-07-03 12:42:59

标签: ruby class instance instance-variables

我有一个课程,我试图根据创建输入确定输出。

class MyCommand
  attr_accessor :command

  def initialize(command = nil)
    @command = command
  end

  # @return Boolean
  def global?
    @command.start_with?('--global')
  end
end

这样就可以了:

foo = MyCommand.new('hello')
foo.command #=> "hello"
foo.global? #=> false

然而,当我通过我的条件时,我会得到一些好的,一些不那么好的结果:

bar = MyCommand.new('--global world')
bar.global? #=> true
bar.command #=> "--global world"

command包含我的条件。

我已尝试创建另一种方法从任何拥有它的命令中分出--global,但后来得到的结果略有不同:

bar.command = 'world'
bar.command #=> "world"
bar.global? #=> false

但这会改变bar的当前状态。

我怎样才能使这个类和方法运行,以便即使在命令改变后global?标志仍然存在?

更好的是,我是否可以仅在global?方法中实施所有更改 - 从而最大限度地减少我对整体课程变更的影响?

1 个答案:

答案 0 :(得分:0)

initialize期间,您可以在设置--global时删除@command,然后将@global分配为true或false,然后编辑@global?以返回值:

class MyCommand
  attr_accessor :command

  def initialize(command = '')
    @command = command.gsub('--global ','')
    @global = command.start_with?('--global') ? true : false
  end

  # @return Boolean
  def global?
    @global
  end
end

请注意,gsub将删除' - global'无论是在command的开始,中间还是结尾,并且假设它总是跟着一个尾随空格,所以如果你不确定你的输入,你就需要一些东西处理command会更加健壮。

P.S。刚刚意识到如果commandnil,这将无效,因此将默认设置更改为空字符串。如果你真的需要它nil,那么将需要一些额外的检查(但不幸的是我现在必须注销)。