-1

我想创建一个 bang 方法preload!,它接受一个参数并像这样修改它:

hash = Hash.new
preload! hash
# => Now `hash` should have some value

我该怎么做?

def preload! param 
  param = # Some values
end

我提到了这个,但我不打算preload!Hash课堂上进行封装。

4

4 回答 4

2

您可以修改作为参数传递的对象,但您必须使用适当的方法来修改接收器:

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
于 2013-09-06T12:53:24.610 回答
0

尝试这个:

def preload! param 
  param.replace(<key value pair that you need>)
end

hash = Hash.new    # hash = {}

preload! hash      # Now hash should have some value
于 2013-09-06T12:30:36.273 回答
0

取决于你想要做什么,但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
于 2013-09-06T12:32:31.773 回答
0

你正在尝试什么,闻起来很糟糕。而不是修改你的论点,你应该做这样的事情

class HashPreloader
  attr_reader :hash

  def initialize(hash)
    @hash = hash || {}
    preload!
  end

  private

  def preload!
    # do your magic
  end
end

然后就

hash = HashPreloader.new.hash

为了进一步详细说明,我需要更多地了解用例。你到底想做什么。

于 2013-09-06T18:42:31.747 回答