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


85

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

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

[]只为数组?

该文件不是很清楚。

Answers:


70

这取决于上下文:

  1. 单独使用或分配给变量时,将[]创建数组并{}创建哈希。例如

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []可以作为自定义方法重写,通常用于从哈希中获取内容(标准库设置[]为与相同的哈希方法fetch)。
    还有一个约定,在同一方法中将其用作类方法您可能会static Create在C#或Java中使用方法的方式。例如

    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
    

    有关最后一个示例,请参见Ruby Hash文档

  3. 这可能是最棘手的问题- {}也是块的语法,但仅在参数parens传递到方法之外时才使用。

    当您调用没有parens的方法时,Ruby会查看您放在逗号的位置以弄清楚参数的结束位置(如果键入了参数,parens会在哪里)

    1.upto(2) { puts 'hello' } # it's a block
    1.upto 2 { puts 'hello' } # syntax error, ruby can't figure out where the function args end
    1.upto 2, { puts 'hello' } # the comma means "argument", so ruby sees it as a hash - this won't work because puts 'hello' isn't a valid hash
    

2
旁注:Hash#fetch并不完全是Hash#[]。{:a => 1,:b => 2} .fetch(:c)IndexError:未找到密钥
tokland 2011年

@tokland:c未找到
yyny

“还有一种约定,将它用作类方法,就像在C#或Java中使用静态Create方法一样。” 这正是我一直在寻找的答案。这也是我最讨厌Ruby的经典示例;您必须了解许多晦涩的小技巧才能阅读Ruby代码。
托尼

21

另一个(不是很明显)用法[]是Proc#call和Method#call的同义词。第一次遇到时,这可能会使您感到困惑。我想其背后的合理性在于它使它看起来更像是正常的函数调用。

例如

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

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

9

从广义上讲,您是正确的。除散列外,通常的样式是大括号{}通常用于可以全部容纳在一行上的块,而不是在多行上使用do/ end

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

Hash["key" => "value"]

与以下内容一样有效:

{ "key" => "value" }

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"

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

2

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

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

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

end

1
什么是@rank.
FeifanZ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.