We couldn’t find the page you are looking for. Perhaps you can try searching:
We couldn’t find the page you are looking for. Perhaps you can try searching:
標準クラス・モジュール > Object > method_missing def method_missing(method_name [, *args [, &block]]) code... end method_missingメソッドを定義すると、存在しないメソッドが呼ばれたときの動作を記述できます。メソッド名の文字列を使って動作を変えるような機能が作れます。 オブジェクトに対して存在しないメソッドを呼び出すと、Rubyはmethod_missingメソッドを呼び出します。引数method_nameには、メソッド名がシンボルで渡されます。引数*argsと&blockでメソッドに渡された引数とブロックを取り出せます。戻り値は存在しないメソッドの戻り値になります。 次の例では、Fixnumクラスにmethod_missingを定義して、「to_数字」というメソッドが呼ばれたときは、整数
10 things you should know about method_missing Posted by amy on August 01, 2007 [update, 9:27 a.m., 8/1/2007: welcome, reddit readers. annoyed at me for calling this post “10 things”? Well, then you’ll really hate me after reading this post!] 1. method_missing is a Ruby kernel method and everyone should know about it. 2. Rails implements some of its funkiest magic with method_missing. When you
2010年01月27日09:23 Ruby Rubyのmethod_missingを使って黒魔術を実装する Rubyにはメソッド探索の最後に呼ばれる(つまり、メソッドが見つからないときに呼ばれる)フック的なメソッドとして method_missing というメソッドがあります。これを上手に利用することで黒魔術的なコードが書けてかっこいいですw #!/usr/bin/ruby module Sasata299 # 適当なモジュールを定義 def hoge(num) return num * 2 end def fuga(num) return num + '299' end end def method_missing(action, *args) if action.to_s =~ /(.+)_(.+)/ eval "include #{$1.capitalize}" __send__ $
gold対策。(基礎力確認問題12) インスタンスメソッドfooをundefしているので、エラーになります。 module Mod def foo puts 'Mod' end end class Cls1 def foo puts 'Cls1' end end class Cls2 < Cls1 include Mod undef foo end Cls2.foo # => # ~> -:17:in `<main>': undefined method `foo' for Cls2:Class (NoMethodError) これは通常の動きなのですが、クラスメソッドをundefする場合はどう書くのだろう? と思ったのでやってみます。 クラスメソッドをundefする ダメなやりかた クラスやselfを指定する方法はNGです。 class C def self.foo; puts 'foo
...以上の String か Symbol を指定します。 @raise NameError 指定したメソッドが定義されていない場合に発生します。 class C def foo end remove_method :foo remove_method :no_such_method # 例外 NameError が発生 end @see Module#undef_method... ...ring か Symbol を指定します。 @raise NameError 指定したメソッドが定義されていない場合に発生します。 //emlist[例][ruby]{ class C def foo end remove_method :foo remove_method :no_such_method # 例外 NameError が発生 end //} @see Module#undef_met
alias_method(new, original) -> Symbol[permalink][rdoc][edit] メソッドの別名を定義します。 例 module Kernel alias_method :hoge, :puts # => :hoge alias_method "foo", :puts # => :foo end alias との違いは以下の通りです。 メソッド名は String または Symbol で指定します グローバル変数の別名をつけることはできません また、クラスメソッドに対して使用することはできません。 [PARAM] new: 新しいメソッド名。String または Symbol で指定します。 [PARAM] original: 元のメソッド名。String または Symbol で指定します。 [RETURN] 作成したエイリアスのメソッド名を表す
クラスの特異クラスにメソッドを追加すればクラスメソッドを追加できる。 class Hoge class << self ["method_a", "method_b"].each do |method_name| define_method method_name do |param| "#{param} was passed to #{method_name}" end end end end クラス定義外で以下のようにしても同じ。 class << Hoge ["method_a", "method_b"].each do |method_name| define_method method_name do |param| "#{param} was passed to #{method_name}" end end end 理屈としては クラスメソッドはクラスの特異メソッドである 特
rubydefine_methodでデフォルト引数が使えないか?と思って調べていたら見つけました。 Ruby1.9以上じゃないとダメですが、no title の2番目の回答にあるようにlambdaリテラルを使えば出来ますね。 class Hoge def create_greet self.class.class_eval do define_method("greet", ->(message = 'Hello', option = ' World!') { puts "#{message} #{option}" }) end end end hoge = Hoge.new hoge.create_greet hoge.greet hoge.greet('Goodbye') hoge.greet('こんにちは', '世界') 最初はなんだこれ?と思ったlambdaリテラルだけど、なれる
メソッド定義 Rubyのオブジェクトはメッセージに反応する。つまりオブジェクトがメッセージを受けると、オブジェクトは対応するメソッドを見つけてその結果を返す。 Rubyではオブジェクト自身はメソッドを持っていない。だからオブジェクトは自身が属するクラスにアクセスして、対応するメソッドを得てその結果を返す。 つまりRubyのメソッドはクラスに定義される。 メソッド定義はdef文で行う。 class Person def name(arg) "My name is #{arg}" end end my = Person.new my.name "Charlie" # => "My name is Charlie" 特定のクラスで定義されたメソッドは、そのクラスから生成されるオブジェクトで使えるようになる。 RubyではすべてのクラスはClassクラスから生成されたオブジェクトである。だからCl
Google+ボタン はてなブックマークボタン 更新日時: 2013年05月31日(金) 作成日時: 2013年05月30日(木) 前の記事 / 次の記事 クラスマクロって何? 例えば class Book attr_accessor :title, :author, :isbn end みたいなやつ。 で、これはそもそも何なのかというと ただのクラスメソッド 。 クラスメソッドとして attr_accessor(:title, :author, :isbn) と呼び出すところを 括弧を省略して attr_accessor :title, :author, :isbn と書いているだけ。 なので attr_accessor のようなクラスマクロをつくりたい場合、 クラスメソッドを定義すればいい 。 まつもと直伝 プログラミングのオキテ 第6回 を参考にすると、 attr_accessor
remove_method(*name) -> self[permalink][rdoc][edit] インスタンスメソッド name をモジュールから削除します。 Ruby 1.8.0 以降は複数のメソッド名を指定して一度に削除できます。 [PARAM] name: 0 個以上の String か Symbol を指定します。 [EXCEPTION] NameError: 指定したメソッドが定義されていない場合に発生します。 例 class C def foo end remove_method :foo remove_method :no_such_method # 例外 NameError が発生 end [SEE_ALSO] Module#undef_method
I've started working on a new edition of Ruby Under a Microscope that covers Ruby 3.x. I'm working on this in my spare time, so it will take a while to finish. Leave a comment or drop me a line and I'll email you when it's finished. Everyone knows that Ruby is a powerful language. Its dynamic nature allows you to concisely write the code you need to actually solve a problem instead of burying your
TL;DR: depending on your app, using define_method is faster on boot, consumes less memory, and probably doesn’t significantly impact performance. Throughout the Rails code base, I typically see dynamic methods defined using class_eval. What I mean by “dynamic methods” is methods with names or bodies that are calculated at runtime, then defined. For example, something like this: class Foo class_eva
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く