人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Ruby のメソッドについてお教え下さい。

下記のようなプログラム deftest.rb があります。
1: #!/usr/bin/env ruby
2: def deftest (str)
3: str.gsub!("yamada", "sato")
4: end
5: name="yamada taro"
6: p deftest(name)
7: p name.deftest

プログラムを実行すると,下記のようにプログラムの7行目でエラーになります。

$ ruby deftest.rb
"sato taro"
deftest.rb:7:in `<main>': private method `deftest' called for "sato taro":String (NoMethodError)

【質問】
・p name.deftestのメソッド呼び出し方で,"sato taro"と出力させるためには,2行目〜4行目の def deftest 〜 end をどのように記述すれば宜しいでしょうか。

●質問者: donkydonut
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●10ポイント

http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fdef.html
メソッド定義式内で呼べるそうです。
なので メソッド定義式を作ってそれから呼び出すようにしましょう。


質問者から

ご回答有り難うございます。具体的なソースコードでご回答頂けると助かります。


2 ● a-kuma3
●290ポイント ベストアンサー

ちょっと無理矢理ですけど、こんな感じ。

#!/usr/bin/env ruby

def deftest (str = nil)
 unless str.nil? then
 str.gsub("yamada", "sato")
 else
 self.gsub("yamada", "sato")
 end
end

name="yamada taro"
p deftest(name)
p name.deftest

引数が nil の場合には、self を対象にするようにしてます。
引数無しで呼び出したときには、やっぱりエラーになっちゃうので、デフォルト引数の指定もしました。
無理矢理感が伝わるでしょうか?

トップレベルにメソッドの定義をすると、スコープ的にはどこからでも呼び出せますが、対象となるオブジェクトがあいまいになってしまいます。
あくまで、非OO な言語の関数やサブルーチンとして使う方が良いでしょう。


それとも、こちらの方が良いでしょうか。

#!/usr/bin/env ruby

def deftest str
 str.gsub("yamada", "sato")
end

class String
 def deftest
 gsub("yamada", "sato")
 end
end

name="yamada taro"
p deftest(name)
p name.deftest

実装が散らばるのも、気持ち悪いんだよなあ...


後、引数の変数を破壊するのは、どうかなと思って、gsub! → gsub にしてますが "yamada taro" の内容を破壊して良いのであれば、両方とも破壊的なメソッドを使ってください。



追記です。

二番目の書き方は、やっぱり気持ち悪いよなあ、と思ってたら、こんなのを見つけた。
http://www.antimon2.atnifty.com/lab/2010/05/ruby-memo-method.html
http://www.antimon2.atnifty.com/lab/2010/11/ruby-memo-method-2.html

というわけで、こんな感じが一番すっきりするのかも。

#!/usr/bin/env ruby

def deftest str
 str.gsub("yamada", "sato")
end

class String
 def deftest
 Kernel.send(:deftest, self)
 end
end

name="yamada taro"
p deftest(name)
p name.deftest

donkydonutさんのコメント
一番最後に記載して頂いたソースコードを使用させて頂きます。 記載されたURL 先内容も参考にさせて頂きます。 大変助かりました。有り難うございました!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ