Ruby 使用string.next在循环内分配哈希值。我能';t解释以下输出
节目:Ruby 使用string.next在循环内分配哈希值。我能';t解释以下输出,ruby,string,hash,char,Ruby,String,Hash,Char,节目: letter = "a" chars = Hash.new for i in 1..5 chars[i] = letter puts letter letter.next! end puts chars ==输出: a b c d e {1=>"f", 2=>"f", 3=>"f", 4=>"f", 5=>"f"} ==问题 我不明白为什么我得不到{1=>“a”,2=>“b”,3=>“c”,4=>“d”,5=>“e”
letter = "a"
chars = Hash.new
for i in 1..5
chars[i] = letter
puts letter
letter.next!
end
puts chars
==输出:
a
b
c
d
e
{1=>"f", 2=>"f", 3=>"f", 4=>"f", 5=>"f"}
==问题
我不明白为什么我得不到{1=>“a”,2=>“b”,3=>“c”,4=>“d”,5=>“e”}
我加入了puts语句,以检查在迭代的每个阶段,字母是否正确
提前谢谢
chars[i]=letter
不会将letter
的副本分配给chars[i]
letter
是对字符串“a”
的引用,它将该引用分配给chars[i]
。因此,在分配char[1]=letter
之后,用letter.next更改letter
,char[1]
现在指的是与letter
相同的字符串新值。请参阅,并将代码更改为:
for i in 1..5
chars[i] = letter.dup # Assign a copy of `letter` to chars[i]
puts letter
letter.next!
end
chars[i]=letter
不会将letter
的副本分配给chars[i]
letter
是对字符串“a”
的引用,它将该引用分配给chars[i]
。因此,在分配char[1]=letter
之后,用letter.next更改letter
,char[1]
现在指的是与letter
相同的字符串新值。请参阅,并将代码更改为:
for i in 1..5
chars[i] = letter.dup # Assign a copy of `letter` to chars[i]
puts letter
letter.next!
end
字母中的感叹号。下一步代码>用于指示潜在危险:下一步代码>更改原始字符串。哈希中的所有值都是相同的字符串,并且每次都会更改
(几乎是?)总是有一个非感叹号版本的方法——“安全”版本。在本例中,它不会更改原始字符串,而是传递一个新字符串
letter = "a"
chars = Hash.new
for i in 1..5
chars[i] = letter
puts letter
letter = letter.next # new string !!
end
puts chars # => {1=>"a", 2=>"b", 3=>"c", 4=>"d", 5=>"e"}
字母中的感叹号。下一步代码>用于指示潜在危险:下一步代码>更改原始字符串。哈希中的所有值都是相同的字符串,并且每次都会更改
(几乎是?)总是有一个非感叹号版本的方法——“安全”版本。在本例中,它不会更改原始字符串,而是传递一个新字符串
letter = "a"
chars = Hash.new
for i in 1..5
chars[i] = letter
puts letter
letter = letter.next # new string !!
end
puts chars # => {1=>"a", 2=>"b", 3=>"c", 4=>"d", 5=>"e"}
提示:您在代码中创建了多少不同的字符串?提示:您在代码中创建了多少不同的字符串?