学习中 ruby 遇到一个问题 我想将“xxx/xxx/xxx”中的“/”替换成“.” 去 RubyDoc 中翻函数,翻到了 replace
s = "hello" #=> "hello"
s.replace "world" #=> "world"
发现这个 replace 不像 java 的 String 的那样 于是思考这个 replace 函数有什么用呢??``` 为什么不直接
s=“world”
呢??
(后来找到了 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
今天还刚给同事讲了引用的关系,如下:
a = b = "123"
a.replace("456")
puts b # 输出 456
a = "789"
puts b # 仍然输出 456 !
#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 这个大概应该就是引用关联的其他变量的意思吧(= =|||,有点别扭)
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