5

Ruby は完全なオブジェクト指向言語です。Ruby では、すべてがオブジェクトなので、何らかのクラスに属します。たとえば5Object class

1.9.3p194 :001 > 5.class
 => Fixnum 
1.9.3p194 :002 > 5.class.superclass
 => Integer 
1.9.3p194 :003 > 5.class.superclass.superclass
 => Numeric 
1.9.3p194 :005 > 5.class.superclass.superclass.superclass
 => Object 
1.9.3p194 :006 > 5.class.superclass.superclass.superclass.superclass
 => BasicObject 
1.9.3p194 :007 > 5.class.superclass.superclass.superclass.superclass.superclass
 => nil 

そのため、 のようにクラス/オブジェクト名を前に付けて、すべてのメソッドを呼び出す必要がありますObject_name#method_name。例:

5.times{|i| puts i}

現在、レールには、この構文に従う、などstylesheet_link_tagのいわゆるヘルパーがあるため、それらは単なる通常の関数であると思います。javascript_include_tagform_forObject_name#method_name

だから私の質問は

  1. これらのレールヘルパーは何ですか?
  2. それらが機能するだけで、どのクラスからも継承されない場合。それは、「ルビーでは、everything a object & there are no primitives. 5.+(6)例として、演算子でさえ単純なメソッドであると言う人がいますか?
4

3 に答える 3

8

レシーバーなしで呼び出される他のものについては、次のようなものが定義されているKernelモジュールを見てください。putsモジュールは に含まれているためObject、そのメソッドはどこでも使用できます。それは、すべてがオブジェクトであるという -- 私見は使い古された -- 主張とどの程度正確に矛盾するのでしょうか?

于 2012-05-18T11:50:32.260 に答える
5

これらの Rails アセット タグ ヘルパーは、ActionView のサブモジュールであり、ActionView::Helpers::AssetTagHelperビューを画像、JavaScript、スタイルシート、フィードなどのアセットにリンクする HTML を生成するメソッドを提供します。

スーパークラスとしてmodules持っclassているので、AssetTagHelpers にもそれがあることを意味します

irb(main):016:0> ActionView::Helpers::AssetTagHelper
=> ActionView::Helpers::AssetTagHelper
irb(main):017:0> ActionView::Helpers::AssetTagHelper.class
=> Module
irb(main):018:0> ActionView::Helpers::AssetTagHelper.class.superclass
=> Object
irb(main):019:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass
=> BasicObject
irb(main):020:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass.superclass
=> nil

注: 簡単にするために、JavascriptIncludeTag のみに焦点を当てますが、それらはすべて非常に似ています。

ここに、というクラスがあります。ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

インスタンス化できるもの

JavascriptIncludeTag.new(config, asset_paths) 

JavascriptIncludeTag クラスには、メソッドasset_tagを呼び出しcontent_tagて正しいタグを返すというメソッドがあります。

パス: /actionpack/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb

require 'action_view/helpers/asset_tag_helpers/asset_include_tag'

# NOTE: on the 'action_view/helpers/asset_tag_helpers/asset_include_tag' it requires '/actionpack/lib/action_view/helpers/tag_helper.rb' so now all this files are connected :)
.
.
.
def asset_tag(source, options)
  content_tag("script", "", { "src" => path_to_asset(source) }.merge(options))
end

パス: /actionpack/lib/action_view/helpers/tag_helper.rb

def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
  if block_given?
    options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
    content_tag_string(name, capture(&block), options, escape)
  else
    content_tag_string(name, content_or_options_with_block, options, escape)
  end
end

そのため、彼らがどのように機能するかはさらに少なくなります。

注:私の説明が少し難しいと感じた場合は、お知らせください。より良い説明を提供するために編集します

于 2012-05-18T12:39:00.523 に答える
4

明示的なレシーバーなしでメソッド呼び出しが表示される場合、レシーバーはselfです。オブジェクトは、さまざまな方法でメソッドを取得できます。最も明白な1つは、メソッドを自分で定義する場合です。次に、モジュールを含めることもできます。

class Person
  # this adds a bunch of methods to Person, making it a Mongoid model
  include Mongoid::Document
end

含めるモジュールと継承するクラスは、同じ方法で機能を取得できます。

したがって、レシーバーのないメソッドを見るときは、「selfこの時点で何ですか?そのクラスは何ですか?どのメソッドが定義されていますか?どのモジュールが含まれていますか?」と考えてください。あなたはルビーとレールについて多くの興味深いことを発見するでしょう。:)

于 2012-05-18T12:07:46.950 に答える