Ruby中不同的括号是什么意思?

时间:2008-08-15 18:09:52

标签: ruby syntax

在Ruby中,{}[]之间有什么区别?

{}似乎用于代码块和哈希。

[]仅适用于数组吗?

该文件不是很清楚。

6 个答案:

答案 0 :(得分:69)

这取决于具体情况:

  1. 当他们自己或分配给变量时,[]会创建数组,而{}会创建哈希值。 e.g。

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []可以作为自定义方法重写,通常用于从哈希中获取内容(标准库设置[]作为哈希方法,与{相同} {1}})
    还有一个约定,它可以像在C#或Java中使用fetch方法一样用作类方法。 e.g。

    static Create

    查看最后一个示例的Ruby Hash docs

  3. 这可能是最棘手的 - a = {1 => 2} # create a hash for example puts a[1] # same as a.fetch(1), will print 2 Hash[1,2,3,4] # this is a custom class method which creates a new hash 也是块的语法,但只有在传递给OUTSIDE方法的参数parens时才会出现。

    当你调用没有parens的方法时,Ruby会查看你放置逗号的位置,以找出参数结束的位置(如果是parens,你输入的是什么)

    {}

答案 1 :(得分:20)

另一个,不那么明显,[]的用法是作为Proc#call和Method#call的同义词。第一次遇到它时可能会有点混乱。我猜它背后的理性是它使它看起来更像是一个普通的函数调用。

E.g。

proc = Proc.new { |what| puts "Hello, #{what}!" }
meth = method(:print)

proc["World"]
meth["Hello",","," ", "World!", "\n"]

答案 2 :(得分:9)

从广义上讲,你是对的。除了哈希之外,一般的风格是花括号{}通常用于可以将所有内容放在一行上的块,而不是跨多行使用do / end

方括号[]在许多Ruby类中用作类方法,包括String,BigNum,Dir和令人困惑的Hash。所以:

Hash["key" => "value"]

与以下一样有效:

{ "key" => "value" }

答案 3 :(得分:3)

方括号[]用于初始化数组。 []的初始化程序案例的文档在

ri Array::[]

花括号{}用于初始化哈希。 {}的初始化程序案例的文档在

ri Hash::[]

方括号也常用作许多核心ruby类中的方法,如Array,Hash,String等。

您可以访问使用

定义方法“[]”的所有类的列表
ri []

大多数方法也有一个允许分配内容的“[] =”方法,例如:

s = "hello world"
s[2]     # => 108 is ascii for e
s[2]=109 # 109 is ascii for m
s        # => "hemlo world"

也可以在块上使用圆括号代替“do ... end”,如“{...}”。

另一种情况,你可以看到使用方括号或大括号 - 在特殊的初始化器中,可以使用任何符号,如:

%w{ hello world } # => ["hello","world"]
%w[ hello world ] # => ["hello","world"]
%r{ hello world } # => / hello world /
%r[ hello world ] # => / hello world /
%q{ hello world } # => "hello world"
%q[ hello world ] # => "hello world"
%q| hello world | # => "hello world"

答案 4 :(得分:2)

一些例子:

[1, 2, 3].class
# => Array

[1, 2, 3][1]
# => 2

{ 1 => 2, 3 => 4 }.class
# => Hash

{ 1 => 2, 3 => 4 }[3]
# => 4

{ 1 + 2 }.class
# SyntaxError: compile error, odd number list for Hash

lambda { 1 + 2 }.class
# => Proc

lambda { 1 + 2 }.call
# => 3

答案 5 :(得分:2)

请注意,您可以为自己的类定义[]方法:

class A
 def [](position)
   # do something
 end

 def @rank.[]= key, val
    # define the instance[a] = b method
 end

end