2008-08-15 14 views

回答

63

这取决于上下文:

  1. 当自己,或者分配给一个变量,[]创建一个rray,并且{}创建散列。例如

    a = [1,2,3] # an array 
    b = {1 => 2} # a hash 
    
  2. []可以重写为定制方法,并且通常用来获取散列东西(标准库设置[]作为哈希的方法,其是相同的fetch
    还有它被用作类方法的惯例,就像您可能在C#或Java中使用static Create方法一样。例如

    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 
    

    查看最后一个例子的红宝石Hash docs

  3. 这可能是最棘手的一个 - {}也是块的语法,但只有当传递给参数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

边注:哈希#取不完全散列# []。 {:a => 1,:b => 2} .fetch(:c)IndexError:找不到密钥 – tokland 2011-02-13 12:43:27

+0

@tokland`:c` not found – YoYoYonnY 2016-12-27 10:58:03

+0

“还有一个约定,它被用作类你也可以在C#或Java中使用静态的Create方法。“这正是我正在寻找的答案。也是我最讨厌Ruby的经典例子;你必须知道很多晦涩的小技巧来阅读Ruby代码。 – Tony 2017-08-28 14:37:15

9

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

方括号[]被用作很多Ruby类的类方法,包括String,BigNum,Dir和足够容易混淆的哈希。所以:

Hash["key" => "value"] 

只是为有效为:

{ "key" => "value" } 
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 
+0

拉姆达{1 + 2} []#=> 3 – 2011-09-01 02:37:36

3

的方括号[]用于初始化数组。 为[]的初始化的情况下该文档是在

ri Array::[] 

的大括号{}用来初始化哈希。 为{初始化情况下}的文档是

ri Hash::[] 

方括号也通常用作许多核心红宝石类的方法,例如数组,散列,字符串,以及其他。

您可以访问有方法“[]”与定义的所有类的列表

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" 
19

另外,不那么明显,[]用途是作为Proc#调用和Method#调用的同义词。这可能会让你第一次遇到它有点困惑。我猜它背后的理由是它使它看起来更像一个正常的函数调用。

E.g.

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

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

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

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

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

end 
相关问题