Ruby 字符串受“downcase!”影响活动
我试图逐行读取文件并处理数据。这是用户表数据。我正在提取Ruby 字符串受“downcase!”影响活动,ruby,string,immutability,Ruby,String,Immutability,我试图逐行读取文件并处理数据。这是用户表数据。我正在提取account\u id和user\u id,然后在保存原始user\u id的同时尝试向下转换user\u id。我有以下代码: # account_id | user_id | address | user_name | passwordDigest line = "g_1e035sadas-035e-45ba-9a1f-40d20000 | MyUser999 | Alabama | Felix The Cat | 12Yoi
account\u id
和user\u id
,然后在保存原始user\u id
的同时尝试向下转换user\u id
。我有以下代码:
# account_id | user_id | address | user_name | passwordDigest
line = "g_1e035sadas-035e-45ba-9a1f-40d20000 | MyUser999 | Alabama | Felix The Cat | 12Yoiqbdz/jCCDASD2kA8D4M5V9pZ3KyWiaj | null | null |"
raw_line = line.split('|')
# => ["g_1e035sadas-035e-45ba-9a1f-40d20000 ", " MyUser999 ", " Alabama ", " Felix The Cat ", " 12Yoiqbdz/jCCDASD2kA8D4M5V9pZ3KyWiaj ", " null ", " null "]
filtered_raw_line = raw_line.take(2)
# => ["g_1e035sadas-035e-45ba-9a1f-40d20000 ", " MyUser999 "]
items = filtered_raw_line.collect{|x| x.strip || x }
# => ["g_1e035sadas-035e-45ba-9a1f-40d20000", "MyUser999"]
original_user_id = items[-1]
# => "MyUser999"
items[-1].downcase!
# => "myuser999"
original_user_id
# => "myuser999"
我不明白为什么在执行downcase之后original\u user\u id
会发生变化代码>对其中一个数组单元格的操作。您可以这样做
original_user_id = items2[-1].dup
object#dup
创建对象的副本,而不是使用您可能执行的相同引用
original_user_id = items2[-1].dup
object#dup
创建对象的副本,而不是使用相同的引用您需要创建对象的副本或复制值,bcsdowncase代码>修改原始字符串,您只需创建对对象的引用,而不是重复的值。因此,您可以轻松做到这一点:
original_user_id = items[-1]
items[-1] = items[-1].downcase
original_user_id
# => MyUser999
或者您可以修改您的代码
items = line.split('|').take(2).map{|s| s.strip}
original_user_id = items[-1]
#=> MyUser999
items[-1] = items[-1].downcase
#=> myuser999
original_user_id
#=> MyUser999
您需要创建对象的副本或复制值,bcsdowncase代码>修改原始字符串,您只需创建对对象的引用,而不是重复的值。因此,您可以轻松做到这一点:
original_user_id = items[-1]
items[-1] = items[-1].downcase
original_user_id
# => MyUser999
或者您可以修改您的代码
items = line.split('|').take(2).map{|s| s.strip}
original_user_id = items[-1]
#=> MyUser999
items[-1] = items[-1].downcase
#=> myuser999
original_user_id
#=> MyUser999
我可能缺少一些面向对象编程的基本概念
有两种基本且不同的操作:
将对象指定给变量
向对象发送消息
只有这样,也就是说,只有对象可以赋值1,只有变量可以赋值2,消息只能发送到objects3
话虽如此,让我们看看您的代码:
items[-1]
从数组中获取最后一个对象并返回它:字符串“MyUser999”
将该对象分配给变量原始用户\u id
项[-1]
和原始用户id
现在都指向同一对象
items[-1].downcase!
获取最后一个对象并发送一个downcase代码>消息。收到此消息后,字符串将其所有字符降级
此时,项[-1]
和原始用户id
仍然引用相同的对象,即(现在已下格)字符串“myuser999”
正如所料
1尽管您可以编写my\u var=my\u other\u var
,但这不会将变量my\u other\u var
分配给my\u var
,而是分配给my\u other\u var
的对象
2 Ruby确实有,但它们只是发送消息的语法糖,即hash.default=123
相当于hash.default=(123)
或hash.send(:default=,123)
3my_var.foo
不会将消息foo
发送到变量my_var
,而是发送到分配给my_var
的对象。同样地,array[0]。foo
不会将消息foo
发送到数组“cell”,而是发送到索引0处的对象
我可能缺少一些面向对象编程的基本概念
有两种基本且不同的操作:
将对象指定给变量
向对象发送消息
只有这样,也就是说,只有对象可以赋值1,只有变量可以赋值2,消息只能发送到objects3
话虽如此,让我们看看您的代码:
items[-1]
从数组中获取最后一个对象并返回它:字符串“MyUser999”
将该对象分配给变量原始用户\u id
项[-1]
和原始用户id
现在都指向同一对象
items[-1].downcase!
获取最后一个对象并发送一个downcase代码>消息。收到此消息后,字符串将其所有字符降级
此时,项[-1]
和原始用户id
仍然引用相同的对象,即(现在已下格)字符串“myuser999”
正如所料
1尽管您可以编写my\u var=my\u other\u var
,但这不会将变量my\u other\u var
分配给my\u var
,而是分配给my\u other\u var
的对象
2 Ruby确实有,但它们只是发送消息的语法糖,即hash.default=123
相当于hash.default=(123)
或hash.send(:default=,123)
3my_var.foo
不会将消息foo
发送到变量my_var
,而是发送到分配给my_var
的对象。同样地array[0]。foo
不会将消息foo
发送到数组“cell”,而是发送到索引0处的对象。因为original\u user\u id=items2[-1]
不会创建字符串的副本。如果要保留原始字符串,则不应更改它。通过items2[-1]=items2[-1]分配一个新字符串。downcase
可以工作。此original\u user\u id=items2[-1]
创建一个引用,不会复制值。我的错误。应该是项目[-1]。停机!而不是项目2[-1]。完蛋了!顺便说一句,x.strip | | x
中的| | x
是无关的,因为String | strip
从不返回nil
或false
。您尚未选择答案。我们都不满意?因为original\u user\u id=items2[-1]
没有创建字符串的副本。如果要保留原始字符串,则不应更改它。通过items2[-1]=items2[-1]分配一个新字符串。downcase
可以工作。此original\u user\u id=items2[-1]
创建一个引用,不会复制值。我的错误。应该是项目[-1]。停机!而不是项目2[-1]。完蛋了!顺便说一句,x.strip | | x
中的| | x
是无关的,因为String | strip
从不返回nil
或false
。您尚未选择答案。我们都不满意?