2017-06-26 62 views
1

这可能是您在编程101中学到的东西。为什么一个哈希文字在Ruby中称为哈希文字?

声明:我没有正式的编程培训。我是自学成才的。

对我来说,文字散列就像是什么this网站建议:第三个可编辑散列称为“咸牛肉散列”。

enter image description here

在Ruby中,有两个数据类型:

  • 哈希
  • 哈希文字

为什么一个叫文字?是因为你从字面上输出关联数组吗?上面的网站声称这是因为定义是内联的。如果是这样,为什么当你可以像这样输入时,哈希也不会被称为文字:

states = Hash.new 

states["CA"] = "California" 
states["MA"] = "Massachusetts" 
states["NY"] = "New York" 

states["MA"].reverse #=> "sttesuhcassaM" 

回答

9

数据类型只有一个:HashHash是一类。您可以实例化对象,并使用它们

h = Hash.new 
h.store("CA", "California") 
h["MA"] = "Massachusetts" 

一个文字只是一个快捷方式,使您能够不明确地使用类创建该类的对象。

h = { "CA" => "California", "MA" => "Massachusetts" } 

同为Array小号

a = Array.new 
a.push(1) 
a << 2 

或者与array文字

a = [1, 2] 
1

文字是固定值。

它不能被编辑,除非你把它分配给一个变量,然后修改它(尽管当然你实际上并没有修改文字)。

https://en.wikipedia.org/wiki/Literal_(computer_programming)

所以,你可以指定一个文字到一个变量,变量比较文字,比较两个字符串,但你不能在一般的直接修改文字。

编辑:请注意,与变量上执行的操作不同,文字被修改的情况会导致创建新对象。

2.2.5 :001 > "foo".upcase! 
=> "FOO" 
2.2.5 :002 > "foo".object_id 
=> 2204993280 
2.2.5 :003 > "foo".upcase!.object_id 
=> 2204964760 
2.2.5 :004 > x = "foo" 
=> "foo" 
2.2.5 :005 > x.object_id 
=> 2204927520 
2.2.5 :006 > x.upcase!.object_id 
=> 2204927520 
2.2.5 :007 > 
+0

你是什么意思的“不能编辑/修改”? '“foo”'是一个字符串文字,“'foo”.upcase!'会修改它。 – Stefan

+0

@stefan不,它看起来像它,但它创建了一个新的对象。看演示。 –

+0

这是因为''foo''每次都会创建一个新的对象,但'upcase!'确实会修改接收者:''foo“.tap {| s | p s.object_id} .upcase!.tap {| s | 's .object_id}' – Stefan

4

你的困惑,从这种误解源于:

在Ruby中,有两个数据类型:

  • 散列
  • 散列文字

首先,有在Ruby芯有更多的数据结构。

但其次,没有“字面散列”这样的东西。哈希文字是指用于定义哈希的语法糖,也就是字面意思。

# This is a hash literal 
x = {foo: 42, bar: :baz} 

# This is not a hash literal 
x = Hash.new 
x[:foo] = 42 
x[:bar] = :baz 

它们是完全相同的。唯一的区别是一个更方便,而另一个更具活力。