Ruby中的括号是什么意思?
在Ruby中, {}
和[]
之间有什么区别?
{}
似乎被用于代码块和散列。
是[]
仅用于数组?
文件不是很清楚。
这取决于上下文:
-
当他们自己,或分配给一个variables,
[]
创build数组,{}
创build散列。 例如a = [1,2,3] # an array b = {1 => 2} # a hash
-
[]
可以作为自定义方法重写,通常用于从哈希(从标准库设置[]
作为散列的方法设置[]
与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
查看最后一个示例的Ruby Hash文档 。
-
这可能是最棘手的一个 –
{}
也是块的语法,但只有传递给参数parens之外的方法。当你调用没有parens的方法时,Ruby会查看你在哪里放置逗号,以确定参数结束的位置(哪里会出现parens,如果你input的话)
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#调用和Method#调用的同义词。 第一次遇到它可能会有点混乱。 我猜它背后的理由是它看起来更像一个正常的函数调用。
例如
proc = Proc.new { |what| puts "Hello, #{what}!" } meth = method(:print) proc["World"] meth["Hello",","," ", "World!", "\n"]
一般来说,你是对的。 除了散列之外,总体风格是花括号{}
经常被用于可以全部放在一行上的块,而不是在多行中使用do
/ end
。
方括号[]
用作很多Ruby类中的类方法,包括String,BigNum,Dir和混淆的哈希。 所以:
Hash["key" => "value"]
和以下一样有效:
{ "key" => "value" }
方括号[]用于初始化数组。 初始化案例的文档是[]
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"
几个例子:
[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
请注意,您可以为自己的类定义[]
方法:
class A def [](position) # do something end def @rank.[]= key, val # define the instance[a] = b method end end