如何创建修改参数的bang方法

时间:2013-09-06 12:20:12

标签: ruby

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

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

我该怎么做?

def preload! param 
  param = # Some values
end

我提到this,但我不打算将preload!封装在Hash类中。

4 个答案:

答案 0 :(得分:1)

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

def preload! hash 
  hash.replace(foo: 1, bar: 2)
end

h = {}
preload! h
h #=> {:foo=>1, :bar=>2}

hash内的preload!分配新哈希只会影响方法内的hash变量,而不会影响外部的h变量:

def preload! hash 
  hash = {foo: 1, bar: 2} # doesn't work as expected
end

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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

进一步详细说明,我需要了解有关用例的更多信息。你究竟想做什么。