irb(main):069:0> a="string"
=> "string"
irb(main):070:0> a.object_id
=> 113672970
irb(main):071:0> a.upcase.object_id
=> 113665130
irb(main):072:0> a.upcase!
=> "STRING"
irb(main):073:0> a.object_id
=> 113672970
irb(main):074:0>
[b]问题补充:[/b]
require 'find'
def find_all_png(dir)
files = []
Find.find(dir) do |path|
if File.extname(path) =~ /.png/i && File.file?(path)
yield path if block_given?
files << path
end
end
files
end
find_all_png('.') {|path| puts path },如程序,关联block传递给函数find_all_png,函数内有一个内层block,内层block的yield取{|path| puts path },并执行这个block吗?
跟下面的代码是同类型吧:
[code="irb"]irb(main):001:0> def foo
irb(main):002:1> [1, 2, 3].each do |i|
irb(main):003:2* yield i if block_given?
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> foo {|i| p i }
1
2
3
=> [1, 2, 3][/code]
yield无论在嵌套多深的地方,都是调用其所在的具名方法的关联block。要注意的是如果一个具名方法包含递归调用的话,关联block是不会跟到递归调用里去的,要显式传递block。
Ruby的字符串本来就是可变的(不像Java和C#的是不可变的)。带叹号的那些方法只是改变了字符串实例的内部状态而已,很正常。
硬要说实现的话,官方版Ruby确实是用指针来传递“self”的。