有条件地覆盖实例属性

Overwrite an instance attribute conditionally

我有一个 class,我正在尝试根据创建输入确定输出。

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 的当前状态。

我该如何着手使这个 class 和方法的行为使得 global? 标志即使在命令更改后仍然存在?

更好的是,我能否仅在 global? 方法中实施所有更改 - 从而最大限度地减少我对 class 总体更改的影响?

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

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 的开头、中间还是结尾,并且假设它后面始终跟有一个尾随 space,所以如果您不确定自己的输入,您需要更强大的东西来处理 command

P.S。刚刚意识到,如果 commandnil,这将不起作用,因此将默认值更改为空字符串。如果您确实需要 nil,则需要进行一些额外的检查(但不幸的是我现在必须注销)。