LONERさんのブログ
ブログ
ruby での値渡し
ruby では値渡ししかない。ただしこれはオブジェクトIDの値渡しなので、オブジェクトそのものに対する操作はメソッドを抜けた後でも影響が残る。たとえば下の関数は、(サンプルの関数だが)引数に渡したオブジェクト自身が変更される。
def ex_func?(text)
["\r", "\n", "\t", " ", " "].each{|ec| text.delete!(ec)}
return false
end
破壊的メソッドは、オブジェクト自身に対して操作をするため、オブジェクトの内容が変更される。ではjavaでいうプリミティブのような渡し方はできないのか。
each の中を text = text.delete!(ec) ってな感じにすれば 引数に渡したオブジェクトは変更されない。しかしそれでは、オブジェクトが何回もつくられる。それはたぶんコスト高だと思うので、やはり破壊的メソッドを使いたい。
そこで・・・cloneを使って別のオブジェクトを作成し、そのオブジェクトに対して破壊的メソッドを実行する。
def ex_func?(text)
text = text.clone
["\r", "\n", "\t", " ", " "].each{|ec| text.delete!(ec)}
return false
end
この方法ならやりたいことができる。
コメントを書く
コメントを投稿するには、ログイン(無料会員登録)が必要です。