define_singleton_methodについて
1.9.1p378を使用しています。
メタプログラミングに興味があって、
Classに動的に生成したmethodを追加する方法を調べてみると
色々な教科書にdefine_methodを使う例が書いてあるのを見つけました。
しかし、実際にプログラムしてみると"undefined method"になってしまいます。
Class.methods.grep /define/
してみると、"define_singleton_method"というものがあり、
define_methodの代わりに使ってみたら一応期待通りに動作しました。
googleで調べてみてもdefine_singleton_methodについて解説が見つけられませんでした。
1.9系になって名前が変わったのでしょうか?
それとも似て非なるものなのでしょうか?
詳しい方、教えてください。<(_ _)>
No.1ベストアンサー
- 回答日時:
define_singleton_methodは1.9で追加されたもので、Objectクラスのメソッドです。
一方define_methodはModuleクラスのprivateメソッドなので、ModuleかClassの中から呼ばないといけません。
(ClassクラスはModuleクラスのサブクラス。Rubyのprivateはサブクラスからも見える)
define_methodであとからメソッドを追加しようとする場合、直接外からは呼べないので、間接的にdefine_methodを呼ぶメソッドを作成しておくか、一度Classを開くなどをやらないといけませんが、
define_singleton_methodを使えば、そんなことはせずに、簡単にできるということです。
No.3
- 回答日時:
>Classに動的に生成したmethodを追加する方法を調べてみると
と書きながら、補足のサンプルを見ると、オブジェクトの特異メソッドを定義しようとしているように見えるのですが。もしそうだとすると、特異クラスを使って、
module L
class R
module Login
def login_setup()
puts "Login login_setup()"
class << self
define_method(:login) do |id,pass|
puts "login() #{id} , #{pass}"
end
end
end
end
end
end
No.2
- 回答日時:
ダメだったコードと、OKだったコードを補足にどうぞ。
この回答への補足
OKだったコード
module L
class R
module Login
def login_setup()
puts "Login login_setup()"
# :loginの代わりに"login"でもよいのは理解している
define_singleton_method(:login) do |id,pass|
puts "login() #{id} , #{pass}"
end
end
end
end
end
class Y
include L::R::Login
def initialize
login_setup() # class Yのインスタンスにlogin()が追加されるのを期待
end
end
#
# MAIN
#
c = Y.new
p c.methods - Object.methods #=>[:login, :login_setup]
if c.respond_to?(:login)
c.login("A", "B") #=>login() A , B
end
[NG]
1) define_singleton_method の代わりに define_method
2) __send__ 使用でdefine_method呼び出し(private methodを強制的に呼ぶ方法)
3) 他、「Rubyクックブック」などに書いてある方法=>全滅
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- Ruby Rubyについて質問です 1 2022/05/13 18:20
- その他(プログラミング・Web制作) どうしてもエラーが解決できません。 1 2022/07/23 04:32
- その他(プログラミング・Web制作) プログラムが書けません。 6 2023/01/22 22:58
- UNIX・Linux Linux Mint 日本語入力できなくなった 4 2022/05/13 16:15
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- 英語 Method: A systematic literature search comprised t 1 2022/12/29 17:26
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
get() と find() の違いについて
-
エクセルVBA オートフィルタで...
-
Csvファイルの最終行を取得する...
-
A1の値をファイル名に指定した...
-
エラー「メソッドまたはデータ...
-
RubyのDateクラスのメソッドが...
-
VBAで型が一致しないエラー(バ...
-
HSTLやSSTL等のI/Oピン
-
No route matches [GET] "/post...
-
pythonのerrorコード
-
windows embdded standard7
-
Rubyについて質問です
-
パイソンのクラス
-
「arg」は何の略?
-
Ruby Selenium 要素の待機
-
テンプレートの特殊化でコンパ...
-
PostScript言語で定積分の計算
-
ぱいソン
-
クラスメソッドのインスタンス...
-
ブロックつきメソッドやyield文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
get() と find() の違いについて
-
エラー「メソッドまたはデータ...
-
教えてください。vb5.0
-
VBAで型が一致しないエラー(バ...
-
実行時エラー450:引数の数が一...
-
エクセルVBA オートフィルタで...
-
メソッド定義の構文のdefって
-
Csvファイルの最終行を取得する...
-
A1の値をファイル名に指定した...
-
Pythonで複数のメソッドをまと...
-
RubyでバイナリデータをIOスト...
-
Rubyでnet::httpを用いてPOSTする
-
VBからAccessのデータベースを...
-
define_singleton_methodについて
-
RubyのDateクラスのメソッドが...
-
Ruby:シルバーについて
-
pythonで、構文エラー
-
Pythonでcall_user_funcを行う
-
【Ruby on Rails】モデルのメソ...
-
.sub(/.+/,"aaaaaaa#{$&}"の置...
おすすめ情報