关于语法:Ruby中不同的括号是什么意思?

关于语法:Ruby中不同的括号是什么意思?

What do the different brackets in Ruby mean?

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

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

[]仅用于数组吗?

该文件不是很清楚。


这取决于上下文:

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

    1
    2
    a = [1,2,3] # an array
    b = {1 => 2} # a hash

  • 可以将[]作为自定义方法重写,并且通常用于从哈希中获取内容(标准库将[]设置为与fetch相同的哈希方法)
    还有一个约定,它用作类方法的方式与在C#或Java中使用static Create方法的方式相同。例如

    1
    2
    3
    4
    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文档。

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

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

    1
    2
    3
    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

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

    例如。

    1
    2
    3
    4
    5
    6
    proc = Proc.new { |what| puts"Hello, #{what}!" }
    meth = method(:print)

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

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

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

    1
    Hash["key" =>"value"]

    与以下内容一样有效:

    1
    {"key" =>"value" }

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

    1
    ri Array::[]

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

    1
    ri Hash::[]

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

    您可以访问所有使用以下方法定义的方法" []"的类的列表:

    1
    ri []

    大多数方法还具有允许分配事物的" [] ="方法,例如:

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

    也可以使用圆括号代替" {...}",而不是在块上使用" do ... end"。

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

    1
    2
    3
    4
    5
    6
    7
    %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"

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A
     def [](position)
       # do something
     end

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

    end

    一些例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [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


    推荐阅读