使用字符串或键值对作为方法参数

时间:2014-01-09 12:38:32

标签: ruby arguments key-value

有没有更好的方法来写这个?基本上我想在哈希中添加一个参数。如果参数是一个key-val对,那么id喜欢按原样添加它。如果参数是一个字符串,我想将其添加为具有nil值的键。以下代码有效,但是有更合适(简单)的方式吗?

第二个问题,是否在一个带有两个参数| key,val |的数组上调用每个方法自动将数组转换为哈希值?

@some_hash = {}

def some_method(input)
    if input.is_a? Hash
        input.each {|key, val| @some_hash[key] = val}
    else
        input.split(" ").each {|key, val| @some_hash[key] = val}
    end
end

some_method("key" => "val")

1 个答案:

答案 0 :(得分:2)

这给出了问题中指示的结果,但它的工作方式与OP给出的代码不同(这意味着OP的代码不能正常工作):

@some_hash = {}

def some_method(input)
  case input
  when Hash then @some_hash.merge!(input)
  when String then @some_hash[input] = nil
  end
end

some_method("foo" => "bar")
some_method("baz")
@some_hash # => {"foo" => "bar", "baz" => nil}
  • 第二个问题

数组永远不会自动转换为哈希。你可能会提到的是,数组[[:foo, :bar]]中数组的元素可以单独引用:

[[:foo, :bar]].each{|f, b| puts f; puts b}
# => foo
# => bar

这是由于破坏性的分配。必要时,Ruby将数组的元素作为单独的东西取出并尝试调整变量的数量。它与:

相同
f, b = [:foo, :bar]
f # => :foo
b # => :bar

此处,您未获得f # => [:foo, :bar]b # => nil