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

Til*_*dor 83 ruby syntax

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

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

[]只为数组?

文件不是很清楚.

Ori*_*rds 70

这取决于具体情况:

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

    a = [1,2,3] # an array
    b = {1 => 2} # a hash
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    有关最后一个示例,请参阅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
    
    Run Code Online (Sandbox Code Playgroud)

  • 旁注:Hash #fetch不完全是Hash#[].{:a => 1,:b => 2} .fetch(:c)IndexError:找不到密钥 (2认同)

sri*_*ris 21

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

例如

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

proc["World"]
meth["Hello",","," ", "World!", "\n"]
Run Code Online (Sandbox Code Playgroud)


Joh*_*ley 9

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

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

Hash["key" => "value"]
Run Code Online (Sandbox Code Playgroud)

和以下一样有效:

{ "key" => "value" }
Run Code Online (Sandbox Code Playgroud)