键值Ruby方法声明

时间:2013-08-05 00:25:12

标签: ruby

我是Ruby的新手。如何声明如下所示的方法:

a.method("hello" => "bye")

如何访问此方法的Key和值?有没有一个很好的资源来回答这些类型的问题? Ruby语法对我来说有点奇怪。

5 个答案:

答案 0 :(得分:1)

我想你不明白"hello" => "bye"是什么。这是一个哈希(就像其他语言中的字典一样)。我们在ruby中声明hash,如下所示:{"key" => "value"}。这是最常用的方式。 Hash.new("key" => "value")也有效。在这里,您的方法将哈希作为参数。它可以在类中声明:

class YourClass

   # you don't need to specify type of parameter because variables in ruby are dynamic
   def method(your_param) 
        # the code bellow will iterate your hash and show each key and value in this hash
        your_param.each do |value, key|
           puts key + " : " + value
        end
        # you can also access to a value in the hash if you know the key
        puts your_param['hello']
   end
end

然后,您可以像a = YourClass.new一样实例化您的类,然后将哈希值传递给您的方法a.method({"hello" => "bye"})。在这里,正如您所看到的,hash将在{}之间声明,但ruby呈现此可选规则,如果方法的最后一个参数是哈希,则可以省略{}

关于ruby中的方法:如果你有一个类YourClass,你可以用def method ... end声明一个实例方法(这意味着你应该只用这个类的实例调用这个方法)或者你可以声明一个类方法,你直接使用类YourClass.method之类的名称来调用它(这意味着你可以调用这个方法而无需实例化你的类,它就像c#等其他语言中的共享方法。)

答案 1 :(得分:1)

  

如何访问此方法的Key和值?有没有一个很好的资源来回答这些类型的问题? Ruby语法对我来说有点奇怪。

是的,当你不承认它时,Ruby语法很奇怪,但是一旦掌握了它就会变得有趣和强大。 Ruby为哈希和数组提供了非常简洁且可能令人困惑的语法。

例如,通常通过以下语法生成数组:

x = [1, 2, 3]

但你可以缩短到:

x = 1, 2, 3

在您的情况下,通常该方法可以被称为:

a.method( { "hello" => "bye" } )

也可以按照问题代码中的定义调​​用它。事实是,在这种情况下,没有含糊不清,因为两个String=>配对只能 意味着您正在生成Hash

这意味着要重现它,您只需创建一个接受哈希并处理值的方法:

def method( hash )
    # hash.keys.first is how you can access the key ( "hello" )
    # hash.first is how you can access the value ( "bye" )
end

现在,您必须记住,使用上述方法,任何使用它的人也可能传递多个值(多个)甚至是非哈希参数,您可以选择忽略或交易 with,如下例所示:

def method( hash )
    raise ArgumentError "..." unless hash.is_a? Enumerable
    raise ArgumentError "..." if hash.size > 1
    # ...
end

如果无法枚举哈希,则在第一行引发异常(如Hash es do)。在第二个中,您检查哈希中键值的数量,如果它超过一个则引发异常。

最后需要注意的是,您不能为该方法使用多个参数,并期望它能够使用该语法:

def method( hash, a ); end
method( "hello" => "bye", 1 )
# => SyntaxError: syntax error, unexpected ')'

尽管如此,可以使用

解决
method( { "hello" => "bye" }, 1 )

玩得开心。

答案 2 :(得分:0)

您可以将 hash 传递给方法,然后像这样获取 key value

def method(hsh = {})
  key = hsh.keys.first
  value = hsh[key]

  puts key, value
end

method("hello" => "bye")

答案 3 :(得分:0)

您可以确认该方法接收哈希值,并查看键和值,如下所示:

def mthd(h)
  p h
  p h.keys
  p.h.values
end

mthd("hello" => "bye")  # => {"hello"=>"bye"}\n["hello"]\n["bye"]

更重要的问题是该方法应该在您的架构中实现什么。

答案 4 :(得分:0)

像这样:

Cow = Object.new

class Say < Hash
  def declare!
    each_pair do |who, what|
      who.define_singleton_method :say do what end
    end
  end
end

Say[ Cow => "hello" ].declare!

Cow.say #=> "hello"