Rubyインタプリタは、定義がまだ解釈されていなければ、オブジェクトにメソッドが存在することをどのように知っていますか?同様に、最初にメソッドを定義するかどうかは、それを使用するのではなく、定義してから定義するかどうかは関係ありませんか?Rubyはメソッドが存在することをいつ知っていますか?
0
A
答えて
5
実行するまでは分かりませんが気にしません。メソッド呼び出し文が実行されると、インタプリタはクラス(オブジェクトではなくコード!)が名前付き関数を持っているかどうかを調べます。そうでなければ、それは祖先の木を探します。見つからない場合はmethod_missing
メソッドを呼び出します。それが定義されていない場合は、エラーが発生します。
関数呼び出しが実行されない場合、エラーは発生しません。
1
問題は、インタプリタが使用するときにそれを見つけようとしましたが、そこには存在しないため、失敗する可能性があります。
コンパイルされた言語では、コンパイル時に「これを2番目のパスで検索します」と言われるかもしれませんが、Rubyの場合はそうは思わないでしょう。
3
インタプリタは、例えば、事前に未定義の方法を知っていません:
o = Object.new
o.foo # => Raises NoMethodError.
class Object
def foo
puts "Foo!"
end
end
o.foo # => prints "Foo!", since the method is defined.
をしかし、Rubyはメソッド呼び出しの受信機は、メソッド名と引数を取りましょうmethod_missing
と呼ばれる巧妙な機能を持っています定義されたメソッドがすでに呼び出しを処理していない限り、それに応じて処理します。
def o.method_missing(sym, *args)
puts "OK: #{sym}(#{args.inspect})"
# Do something depending on the value of 'sym' and args...
end
o.bar(1, 2, 3) #=> OK: bar(1, 2, 3)
「メソッドが見つかりません」は、アクティブなレコード検索メソッドなど、「動的に定義された」機能を持つ意味がある場所で使用されます。
関連する問題
- 1. メソッドは、いくつかのスレッドを待っていると通知します
- 2. 誰かが良いRuby ePubライブラリを知っていますか?
- 3. rubyで始まることを知っているPHP
- 4. 部分名+拡張子に等しいファイルが存在することを知っています
- 5. CUDAプログラム内にnvprofが存在することをどのように知っていますか?
- 6. メソッドが存在していても見つかりません
- 7. Firebase iOS - 値が存在することを知っているとスナップショットが突然nullになる
- 8. アプリケーションはネットワークドライブが存在しないと言っていますが、OpenFileDialogを使って見つけました。
- 9. Ruby - ハッシュキーが存在することを確認してください。
- 10. GroupPrincipal.FindByIdentityは、グループが存在することがわかっていてもなぜnullを返しますか?
- 11. git bashは存在するファイルが存在しないと言っていますか?
- 12. Railsは自分のスキーマに従って、この関連付けに主キーが存在することをどのように知っていますか?
- 13. Xcodeは「Cloud.h」が存在しないと誤って言っています
- 14. 存在しないxmlノードをチェックすると、ここで何が間違っていますか?
- 15. Ruby on railでは、カラムが存在しないと言っていますが、スキーマ
- 16. 誰かがpsql 8.xをどこに見つけることができるか知っていますか?
- 17. 誰かが "perlfiddle"というサービスについて知っていますか?
- 18. なぜSQLiteはinstrが存在しないと言っていますか?
- 19. 回避方法:アプリケーションに依存しないexeが存在することをユーザーに通知しますか?
- 20. 私はjoomlaについて何を知っていますか?
- 21. HttpTaskAsyncHandler - ブロックするようですが、何かが間違っていることを知っています
- 22. 現在のメソッドは、どのメソッドが呼び出されたかを知ることができますか?
- 23. カーネルがどのようにユーザスペース内にネットリンクが存在するかを知っていますか?
- 24. このExecuteDatasetメソッドでは何が起こっていますか?
- 25. テーブルが存在し、デフォルト値を持っていることを確認する
- 26. メソッドは存在しますが、java.lang.IllegalStateException:メソッドが見つかりません
- 27. Rubyの代替ctagsジェネレータを知っていますか
- 28. メソッドがアクションメソッドであることをASP.NET MVCはどのように知っていますか?
- 29. 特定のテキストの存在に基づいてメソッドをトリガするRubyのアルゴリズム
- 30. このGetCardinalityメソッドがやっていることを誰かに説明することはできますか?
これは本当ではありません。コンパイルされた言語(例えばC言語)があり、これはシングルパスであり、使用する前に各関数を宣言する必要があります。また、解釈された言語が複数のパスを使用できず、関数やメソッドを定義する前にそれを使用できる理由はありません。 Rubyがこれをしない理由は、実行時にルビメソッドの定義が行われ、メソッドが実際に複数回またはループ内で定義できるため、メソッド定義が最初のパスで相互作用するときにそれらを単一にすることはできません他のコードと一緒に。 – sepp2k
あなたが正しいです、私は答えを修正します。 – OscarRyz