Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何创建修改参数的bang方法_Ruby - Fatal编程技术网

Ruby 如何创建修改参数的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

我想创建一个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 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 modify
self
中,变量总是引用objects.bang方法,而不是参数。您可能不想这样做。修改参数的方法被认为是错误的做法。代码的读者将假定
preload
来修改被调用方(这在Ruby中是一种约定),而不是参数,这将使您感到困惑。您应该在调用它之前定义方法。Oops,只使用OP的代码。正如@Stefan所建议的,应该使用适当的方法来修改接收方。这里的Replace方法正确,而不是merge!。编辑了我的答案。
Hash#merge也会修改接收器!是的,但是如果预加载呢!在散列已经填充了其他一些键值对之后使用。比如说,
h={:foo=>1}
。然后他称之为预加载!方法。我只是觉得这不能达到OP想要的目的。