Ruby 如何创建修改参数的bang方法
我想创建一个bang方法Ruby 如何创建修改参数的bang方法,ruby,Ruby,我想创建一个bang方法preload,它接受一个参数并对其进行如下修改: hash = Hash.new preload! hash # => Now `hash` should have some value 我怎么做 def preload! param param = # Some values end 我提到了,但我不打算封装preload在散列类中。尝试以下操作: def preload! param param.replace(<key value pa
preload代码>,它接受一个参数并对其进行如下修改:
hash = Hash.new
preload! hash
# => Now `hash` should have some value
我怎么做
def preload! param
param = # Some values
end
我提到了,但我不打算封装preload代码>在散列类中。尝试以下操作:
def preload! param
param.replace(<key value pair that you need>)
end
hash = Hash.new # hash = {}
preload! hash # Now hash should have some value
def预加载!param
参数替换()
结束
hash=hash.new#hash={}
预加载!散列#现在散列应该有一些值
取决于您正在尝试做什么,但是实例评估
应该给您这种灵活性
def mutator! object
object.instance_eval do
def to_s
'bonk'
end
end
end
h = {}
h.to_s # => {}
mutator! h
h.to_s # => bonk
您可以修改作为参数传递的对象,但必须使用适当的方法修改接收器:
def preload! hash
hash.replace(foo: 1, bar: 2)
end
h = {}
preload! h
h #=> {:foo=>1, :bar=>2}
将新哈希分配给hash
内部预加载
只影响方法内部的hash
变量,而不影响方法外部的h
变量:
def preload! hash
hash = {foo: 1, bar: 2} # doesn't work as expected
end
你正在尝试的东西,闻起来很难闻。你不应该修改你的论点,而应该做这样的事情
class HashPreloader
attr_reader :hash
def initialize(hash)
@hash = hash || {}
preload!
end
private
def preload!
# do your magic
end
end
然后就
hash = HashPreloader.new.hash
为了进一步阐述,我需要更多地了解用例。您实际上想做什么。考虑到您的方法必须封装在一个类中,我不确定您的要求是否明确。@Ruby中的shiva参数总是通过引用传递。Ruby没有任何传递值的概念。在ruby modifyself
中,变量总是引用objects.bang方法,而不是参数。您可能不想这样做。修改参数的方法被认为是错误的做法。代码的读者将假定preload
来修改被调用方(这在Ruby中是一种约定),而不是参数,这将使您感到困惑。您应该在调用它之前定义方法。Oops,只使用OP的代码。正如@Stefan所建议的,应该使用适当的方法来修改接收方。这里的Replace方法正确,而不是merge!。编辑了我的答案。Hash#merge代码>也会修改接收器!是的,但是如果预加载呢!在散列已经填充了其他一些键值对之后使用。比如说,h={:foo=>1}
。然后他称之为预加载!方法。我只是觉得这不能达到OP想要的目的。