Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用string.next在循环内分配哈希值。我能';t解释以下输出_Ruby_String_Hash_Char - Fatal编程技术网

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"}

提示:您在代码中创建了多少不同的字符串?提示:您在代码中创建了多少不同的字符串?