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

时间:2020-03-05 18:39:56  来源:igfitidea点击:

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

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

" []"仅适用于数组吗?

该文件不是很清楚。

解决方案

回答

从广义上讲,我们是正确的。除了散列之外,通常的样式是大括号" {}"通常用于可以全部插入一行的块,而不是在多行上使用" do" /" end"。

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

Hash["key" => "value"]

与以下内容一样有效:

{ "key" => "value" }

回答

一些例子:

[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

回答

这取决于上下文:

  • 单独使用或者分配给变量时," []"创建数组,而" {}"创建哈希。例如
a = [1,2,3] # an array
b = {1 => 2} # a hash
  • 可以重写作为自定义方法,通常用于从哈希中获取内容(标准库将设置为哈希中的方法,与" fetch"相同),还有一个约定它用作类方法的方式与我们在C#或者Java中使用"静态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之外传递给方法时才使用。当我们在不带括号的情况下调用方法时,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

回答

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

ri Array::[]

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

ri Hash::[]

在许多核心红宝石类(例如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"

回答

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

例如。

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

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

回答

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

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

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

end