我想创建一个 bang 方法preload!
,它接受一个参数并像这样修改它:
hash = Hash.new
preload! hash
# => Now `hash` should have some value
我该怎么做?
def preload! param
param = # Some values
end
我提到了这个,但我不打算preload!
在Hash
课堂上进行封装。
您可以修改作为参数传递的对象,但您必须使用适当的方法来修改接收器:
def preload! hash
hash.replace(foo: 1, bar: 2)
end
h = {}
preload! h
h #=> {:foo=>1, :bar=>2}
hash
为inside分配一个新的哈希preload!
只会影响hash
方法内部的变量,而不是h
外部的变量:
def preload! hash
hash = {foo: 1, bar: 2} # doesn't work as expected
end
尝试这个:
def preload! param
param.replace(<key value pair that you need>)
end
hash = Hash.new # hash = {}
preload! hash # Now hash should have some value
取决于你想要做什么,但instance_eval
应该给你这种灵活性
def mutator! object
object.instance_eval do
def to_s
'bonk'
end
end
end
h = {}
h.to_s # => {}
mutator! h
h.to_s # => bonk
你正在尝试什么,闻起来很糟糕。而不是修改你的论点,你应该做这样的事情
class HashPreloader
attr_reader :hash
def initialize(hash)
@hash = hash || {}
preload!
end
private
def preload!
# do your magic
end
end
然后就
hash = HashPreloader.new.hash
为了进一步详细说明,我需要更多地了解用例。你到底想做什么。