我有一个模型user
,其中包含以下方法:
def number_with_hyphen
number&.insert(8, "-")
end
当我在测试中多次运行时,我得到以下输出:
users(:default).number_with_hyphen
"340909-1234"
(byebug) users(:default).number_with_hyphen
"340909--1234"
(byebug) users(:default).number_with_hyphen
"340909---1234"
(byebug) users(:default).number_with_hyphen
"340909----1234"
它更改了number
?以下是文档https://apidock.com/ruby/v1_9_3_392/String/insert
当我将我的方法重组为:
def number_with_hyphen
"#{number}".insert(8, "-") if number
end
如果像预期的那样工作。输出保持不变!
您将如何构建代码,如何执行插入? 我应该使用哪种方法。感谢
答案 0 :(得分:2)
如果您正在使用insert
方法,该方法在文档中明确指出"修改 str ",那么您将需要避免这样做两次,使其幂等,或使用另一种不会破坏数据的方法。
一种方法是使用简单的正则表达式来提取您感兴趣的组件,忽略已存在的任何短划线:
def number_with_hyphen
if (m = number.match(/\A(\d{8})\-?(\d+)\z/))
[ m[1], m[2] ].join('-')
else
number
end
end
最终真的很安全。如果修改为接受参数,则可以测试:
number = '123456781234'
number_with_hyphen(number)
# => "12345678-1234"
number
# => "123456781234"
number_with_hyphen(number_with_hyphen(number))
# => "12345678-1234"
number_with_hyphen('1234')
# => "1234"
调用它两次并不会破坏任何东西,任何不符合要求的数据都会按原样发送。
答案 1 :(得分:0)
克隆字符串:
"#{number}".clone.insert(8, '-')