0

我对 Ruby 完全陌生。如何声明如下所示的方法:

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

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

4

5 回答 5

1

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

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

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

x = [1, 2, 3]

但您可以将其缩短为:

x = 1, 2, 3

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

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

它也可以按照您在问题代码中定义的方式调用。事实是,在这种情况下没有歧义,因为两个Strings 与 a 配对=>只能意味着您正在生产一个.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

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

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

如果无法枚举散列(就像Hashes 一样),则在第一行中引发异常。在第二个中,您检查散列中键值的数量,如果超过一个则引发异常。

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

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

即使,它可以通过使用来解决

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

玩得开心。

于 2013-08-05T01:27:01.477 回答
1

我想你不明白是什么"hello" => "bye"。这是一个哈希(就像其他语言的字典)。我们像这样在 ruby​​ 中声明哈希{"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# 等其他语言中的共享方法)。

于 2013-08-05T01:19:10.597 回答
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"
于 2013-08-05T06:59:39.633 回答
0

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

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

  puts key, value
end

method("hello" => "bye")
于 2013-08-05T00:53:48.067 回答
0

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

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

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

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

于 2013-08-05T01:10:04.573 回答