Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 字符串受“downcase!”影响活动_Ruby_String_Immutability - Fatal编程技术网

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
创建对象的副本,而不是使用相同的引用

您需要创建对象的副本或复制值,bcs
downcase修改原始字符串,您只需创建对对象的引用,而不是重复的值。因此,您可以轻松做到这一点:

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

您需要创建对象的副本或复制值,bcs
downcase修改原始字符串,您只需创建对对象的引用,而不是重复的值。因此,您可以轻松做到这一点:

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)

    3
    my_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)


    3
    my_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
    。您尚未选择答案。我们都不满意?