『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

クラスメソッド“say”を定義しました。
クラス外からこれを呼び出すときは
Hoge.say 'hello'
で、同じクラス内の、インスタンスメソッド“hello”からクラスメソッド“say”を呼び出したいとき、クラス外から呼び出すのと同じように呼び出すことはできました。

class Hoge
 def self.say(word)
  puts word
 end
 def hello
  Hoge.say('hello')
 end
end


しかし、メソッド“hello”内にHogeというクラス名を直書きしたくないのですが、どんな文法を使用すればよろしいでしょうか?
# Hoge#hello内での試行錯誤
self.say 'hello' => エラー
say 'hello' => エラー

ひょっとして、クラス名を直書きする以外手段はないのでしょうか・・?

A 回答 (1件)

def hello


 self.class.say('hello')
end
でしょうか。何かもっと違う書き方もありそうな気もしますけど。
    • good
    • 0
この回答へのお礼

確かに・・示されれば、あーなるほどと思いました。

なんだかずばりベストな回答である気がしますが、
何かもっと違う書き方、思いついたらお願いします。

Thanks!

お礼日時:2009/04/26 23:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QClassの中のClass定義について

Classの中のClass定義について

主にWindows環境でrubyを使用しているライトユーザーです。
ネットでソースを拝見していると、Class定義の中に更にClass定義がされているプログラムをみることがあります。以下のような感じですね。

Class Foo
 Class Bar
 ……
 end
……
end

このようにClass定義を他のClass定義の中に書くのは、どのような理由によるのでしょうか?
素朴な疑問です、ご教示いただければ嬉しいです。

Aベストアンサー

名前空間ですね。

class Foo
 class Bar
 ……
 end
……
end
class Hoge
 class Bar
 ……
 end
……
end
class Bar
 ……
end

だと、それぞれの、Barクラスは別物で、それぞれFoo::Bar、Hoge::Bar、Barという名前のクラスになります。ただし、クラスFooの中ではFoo::BarはBarと略記できるし、Hogeの中ではHoge::BarをBarと略記出来ます。

例えば、Fooクラスの中でしか利用しないクラスがあった場合に、他のクラスと名前の衝突を気にすることなく名前を付けることが出来るわけです。ただし、Fooクラス外からもFoo::Barのように利用することが出来るので、Fooクラス内に隠蔽できるわけではないですが。

定数などもクラスの中で定義すれば、Foo::CONSTNAME のような定数が出来ます。

Qインスタンス内から自分のクラス名を取得する方法

クラスインスタンス内から自分のクラス名を取得しようと思うと、self.class.nameで取得できますが、type.nameでも取得できます。
しかし、typeは非推奨メソッドとなっているため、警告が出て、このままでは使用することができません。

素直にself.classを使えばいいのかもしれませんが、selfのワンクッションがどうにも気に入りません。

スマートな記述方法あったら教えて下さい。

# self.class.nameを使用する場合
class MyClass
 def print_classname
  puts self.class.name
  # puts class.name これはエラー
 end
end

# type.nameを使用する場合
class MyClass2
 def print_classname
  puts type.name # これはdeprecatedの記述で警告が出る
 end
end

Aベストアンサー

self を書きたくないということなら、
alias :xclass :class
しておいて、
xclass.name
するくらいしかないと思います。スマートとは思いませんけど。

逆に、インスタンスメソッド定義の中で、class以外のメソッド呼び出しの時もselfを省略しないで書くことにすれば、全部統一が取れます。

Q配列に複数の値があるか簡潔に判断する方法

hairetu = [1,2,3,4,5]

という配列があった時
3と4が含まれているかを判断するには

if hairetu.include?(3) && hairetu.include?(4)
 p "3と4が含まれている"
end

と書けばよいのですが
条件が増えたら、見にくくなってしまいます。
そういった理由で

if hairetu.include?(3,4)

if hairetu.include?(3 or 4)
という具合に、短く書く方法があれば
ご教授お願い致します。

Aベストアンサー

この場合はArray#-が単純で良いと思います。
([3, 4] - hairetu).empty?


人気Q&Aランキング

おすすめ情報