86

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

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

[]仅适用于数组?

文档不是很清楚。

4

6 回答 6

74

这取决于上下文:

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

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
  2. []可以作为自定义方法重写,通常用于从哈希中获取内容(标准库设置[]为哈希上的fetch方法
    ,与您可能会使用static CreateC# 或 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. 这可能是最棘手的一个 - {}也是块的语法,但仅在传递给参数括号之外的方法时。

    当你调用不带括号的方法时,Ruby 会查看你放置逗号的位置以找出参数的结束位置(如果你输入了括号,它们会在哪里)

    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
    
于 2008-08-17T21:17:44.680 回答
23

另一个不太明显的用法[]是作为 Proc#call 和 Method#call 的同义词。当您第一次遇到它时,这可能会有点令人困惑。我想它背后的原因是它使它看起来更像一个普通的函数调用。

例如

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
于 2009-04-02T15:47:21.460 回答
9

从广义上讲,你是对的。与散列一样,一般风格是花括号{}通常用于可以全部放在一行中的块,而不是在多行中使用do/ end

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

Hash["key" => "value"]

和以下一样有效:

{ "key" => "value" }
于 2008-08-15T18:24:06.933 回答
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"
于 2008-09-17T07:52:50.970 回答
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
于 2008-08-15T19:03:12.893 回答
2

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

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

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

end
于 2009-10-13T21:47:50.233 回答