Ruby 关于 String 的 replace 问题

sawater · 2012年10月11日 · 最后由 ericguo 回复于 2016年02月28日 · 8755 次阅读

学习中 ruby 遇到一个问题 我想将“xxx/xxx/xxx”中的“/”替换成“.” 去 RubyDoc 中翻函数,翻到了 replace

s = "hello"         #=> "hello"
s.replace "world"   #=> "world"

发现这个 replace 不像 java 的 String 的那样 于是思考这个 replace 函数有什么用呢??``` 为什么不直接

s=“world”

呢??

(后来找到了 gsub 函数解决替换的需要)

少年你用 java 时不会看文档吗?

这问题不错啊 我也从没用过 replace 方法,甚至不知道这个方法的存在 只知道 Ruby 使用 sub 和 gsub 做替换的

其实这是个好问题。

赋值在 ruby 中相当于是调用方法,你并不是任何时候都可以方便的替换内容。所以需要 replace.给你个例子。

class A
  attr_reader :a

  def a=(a_string)
    @a = a_string + "!"
  end
end

a = A.new
a.a = "test"

puts a.a


a.a.replace("test")

puts a.a
~/Desktop $ ruby test.rb 
test!
test

好吧,我把这个和 tr 记混了..

#4 楼 @poshboytl ruby 真的好灵活啊 ```` 没有 attr_writer 也能改变属性~ #6 楼 @lyfi2003 引用~原来如此~学习了哈~~~

😆 应该就是说 a.replace 只改变变量的内容 而赋值则是重新实例化了一个变量

综合了下代码~这样应该就更清楚了

class AAA
    attr_reader :a
    def initialize()
        @a="sss"
        puts "ini a:#{a},obj_id:#{a.object_id}"
    end
end

a=AAA.new
puts "new a:#{a.a},obj_id:#{a.a.object_id}"
a.a.replace("test")
puts "replace a:#{a.a},obj_id:#{a.a.object_id}"

puts "#####################"

a = b = "123"
puts "a:#{a},obj_id:#{a.object_id}  b:#{b},obj_id:#{b.object_id}"
a.replace("456")
puts "a:#{a},obj_id:#{a.object_id}  b:#{b},obj_id:#{b.object_id}"
a = "789"
puts "a:#{a},obj_id:#{a.object_id}  b:#{b},obj_id:#{b.object_id}"

执行结果:

ini a:sss,obj_id:75208020
new a:sss,obj_id:75208020
replace a:test,obj_id:75208020
#####################
a:123,obj_id:75207890  b:123,obj_id:75207890
a:456,obj_id:75207890  b:456,obj_id:75207890
a:789,obj_id:75207750  b:456,obj_id:75207890

文档里面这么说"Replaces the contents and taintedness of str with the corresponding values in other_str." taintedness 这个大概应该就是引用关联的其他变量的意思吧(= =|||,有点别扭)

https://github.com/jhjguxin/code-style-guide/blob/master/ruby-style-guide.zh-cn.md#%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F 这样 也是可用的 嘿嘿


match = string[/regexp/]             # get content of matched regexp
match = "regexp"[/regexp/]           #=> "regexp"
first_group = string[/text(grp)/, 1] # get content of captured group
first_group = 'textgrp'[/text(grp)/, 1] #=> 'grp'
first_group = 'text grp'[/text(grp)/, 1] #=> nil
string[/text (grp)/, 1] = 'replace'  # string => 'text replace'
"text grp"[/text (grp)/, 1] = 'replace'  # string => 'text replace'
"text 1grp"[/text (grp)/, 1] = ' replace' if  "text 1grp"[/text (grp)/, 1].present?  #=> nil 
[1] pry(main)> a = "1"
=> "1"
[2] pry(main)> a.__id__
=> 10894700
[3] pry(main)> a.replace "2"
=> "2"
[4] pry(main)> a.__id__
=> 10894700
[5] pry(main)> a = "2"
=> "2"
[6] pry(main)> a.__id__
=> 18923680

我想将“xxx/xxx/xxx”中的“/”替换成“.”

xxx/xxx/xxx.tr('/', '.')
需要 登录 后方可回复, 如果你还没有账号请 注册新账号