我对 Ruby 完全陌生。如何声明如下所示的方法:
a.method("hello" => "bye")
以及如何访问此方法的键和值?有没有很好的资源来回答这些类型的问题?Ruby 语法对我来说有点奇怪。
我对 Ruby 完全陌生。如何声明如下所示的方法:
a.method("hello" => "bye")
以及如何访问此方法的键和值?有没有很好的资源来回答这些类型的问题?Ruby 语法对我来说有点奇怪。
以及如何访问此方法的键和值?有没有很好的资源来回答这些类型的问题?Ruby 语法对我来说有点奇怪。
嗯,是的,当你不承认它的时候,Ruby 语法很奇怪,但是一旦掌握了它就会很有趣而且很强大。Ruby 对哈希和数组有一个非常简洁且可能令人困惑的语法。
例如,通常会通过以下语法生成数组:
x = [1, 2, 3]
但您可以将其缩短为:
x = 1, 2, 3
在您的情况下,通常该方法可以称为:
a.method( { "hello" => "bye" } )
它也可以按照您在问题代码中定义的方式调用。事实是,在这种情况下没有歧义,因为两个String
s 与 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
如果无法枚举散列(就像Hash
es 一样),则在第一行中引发异常。在第二个中,您检查散列中键值的数量,如果超过一个则引发异常。
最后要注意的是,您不能为该方法取出多个参数并期望它使用该语法:
def method( hash, a ); end
method( "hello" => "bye", 1 )
# => SyntaxError: syntax error, unexpected ')'
即使,它可以通过使用来解决:
method( { "hello" => "bye" }, 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# 等其他语言中的共享方法)。
像这样:
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"
您可以将hash传递给方法,然后像这样获取key,value
def method(hsh = {})
key = hsh.keys.first
value = hsh[key]
puts key, value
end
method("hello" => "bye")
您可以确认该方法接收到哈希,并查看键和值,如下所示:
def mthd(h)
p h
p h.keys
p.h.values
end
mthd("hello" => "bye") # => {"hello"=>"bye"}\n["hello"]\n["bye"]
更重要的问题是该方法应该在您的架构中完成什么。