有条件地覆盖实例属性
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。刚刚意识到,如果 command
是 nil
,这将不起作用,因此将默认值更改为空字符串。如果您确实需要 nil
,则需要进行一些额外的检查(但不幸的是我现在必须注销)。
我有一个 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。刚刚意识到,如果 command
是 nil
,这将不起作用,因此将默认值更改为空字符串。如果您确实需要 nil
,则需要进行一些额外的检查(但不幸的是我现在必须注销)。