用于 !和红宝石中的chomp方法

时间:2016-06-25 04:53:57

标签: ruby

我是红宝石的新手。当我尝试读取没有换行符的行时,我学习了chomp方法。此方法用于从字符串末尾删除\ n。所以,我尝试了以下场景。

程序:

arr = Array.new;

while true
    char = gets     // Read line from input
    if char == nil      // If EOF reach then break  
        break
    end
    char.chomp      // Try to remove \n at the end of string
    arr << char     // Append the line into array
end

p arr           // print the array

输出:

$ ruby Array.rb 
abc
def
["abc\n", "def\n"]
$ 

但它并没有删除字符串末尾的换行符。但如果&#39;!&#39;在chomp(char.chomp!)的末尾提供,它工作正常。所以 什么需要&#39;!&#39;以及为什么使用它?什么 !代表什么?

3 个答案:

答案 0 :(得分:5)

作为good documentation says,chomp返回一个删除了换行符的新字符串,而chomp!修改字符串本身。

因此,char.chomp // Try to remove \n at the end of string返回一个新字符串,但您没有将新字符串分配给任何变量。

以下是可能的解决方法:

char.chomp!      // Try to remove \n at the end of string
arr << char     // Append the line into array

str = char.chomp      // Try to remove \n at the end of string
arr << str     // Append the line into array

arr << char.chomp     // Append the line into array

答案 1 :(得分:0)

当您执行此操作char.chomp时,输出将不会有\n个字符,但char内的字符串将保持不变,在ruby中!是一个使用的约定在改变对象本身的方法之后,这并不意味着只是向您的方法添加!将改变该对象,但它只是方法定义中遵循的约定,因此如果您执行{{1} },它会改变char本身的值,这就是你看到正确结果的原因。你在这里做的只是char.chomp!,这会将没有arr << char.chomp的值添加到你的数组中,也不会改变实际的对象。

答案 2 :(得分:-1)

结尾的方法表明该方法将修改它所调用的对象。 Ruby称这些&#34;危险的方法&#34;因为他们改变了其他人可能引用的状态。

   arr = Array.new;

    while true
        char = gets     
        if char == nil      
            break
        end

        char.chomp      
        puts char

   // result = 'your string/n' (The object reference hasn't got changed.)

    char2 = char.chomp

    puts char2

   // result = 'your string' (The variable changed but not the object reference)

    char.chomp!

    puts char

  //  result = 'your string' (The object reference chaned)

    Now you can either do,

    arr << char     // Append the line into array

    or,

    arr << char2    
    end

    p arr           // print the array

他们都给你相同的结果。