2012-05-18 27 views
5

Ruby là ngôn ngữ hướng đối tượng hoàn toàn. Trong ruby, tất cả mọi thứ là một đối tượng & do đó, thuộc về một số lớp. ví dụ 5 thuộc về Object classRuby có thực sự là một ngôn ngữ hướng đối tượng đầy đủ không?

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 

như vậy, chúng ta phải gọi tất cả các phương pháp bằng cách đặt trước tên lớp/đối tượng như trong Object_name#method_name. Ví dụ:

5.times{|i| puts i} 

bây giờ, đường ray có những cái gọi là những người giúp đỡ như stylesheet_link_tag, javascript_include_tag, form_for vv mà làm theo Object_name#method_name cú pháp này, do đó, tôi đoán họ là chức năng chỉ bình thường.

vì vậy câu hỏi của tôi là

  1. những đường ray giúp việc là gì?
  2. Nếu chúng chỉ hoạt động & thì không được kế thừa từ bất kỳ lớp nào. Điều đó không trái với yêu cầu được thực hiện nói - bằng ruby, everything a object & there are no primitives. Ví dụ: mọi người trích dẫn số 5.+(6) cho biết ngay cả các toán tử chỉ là các phương thức đơn giản?
+1

Khi bạn thấy phương pháp gọi mà không cần nhận rõ ràng, sau đó người nhận là 'self'. Làm thế nào chính xác bạn đã kết luận rằng "tất cả mọi thứ là một đối tượng" là không đúng sự thật? –

+0

Ồ, tôi không biết về 'self'. Tôi đoán tôi đã sai, cảm ơn! – CuriousMind

+1

Tôi sẽ nâng cấp câu trả lời này lên một câu trả lời :) –

Trả lời

8

Đối với những thứ khác gọi mà không có người nhận, nhìn vào các mô-đun Kernel, nơi những thứ như puts được định nghĩa. Vì mô-đun được bao gồm trong Object, các phương thức của nó có sẵn ở mọi nơi. Làm thế nào chính xác mà sẽ mâu thuẫn với - IMHO lạm dụng - tuyên bố rằng tất cả mọi thứ là một đối tượng?

+0

Vì vậy, những phương pháp này được định nghĩa trong một mô-đun, thay vì lớp học? câu trả lời của bạn đã trở thành khoảnh khắc * aha * của tôi trong ngày. hấp dẫn! – CuriousMind

4

Khi bạn thấy lời gọi phương thức mà không có bộ thu rõ ràng, thì người nhận là self. Các đối tượng có thể nhận các phương thức theo nhiều cách khác nhau. Một, rõ ràng nhất, là khi bạn tự xác định phương pháp. Sau đó, bạn cũng có thể bao gồm các mô-đun.

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

Mô-đun bạn bao gồm và các lớp bạn kế thừa có thể có được chức năng theo cách tương tự.

Vì vậy, khi bạn nhìn thấy phương pháp mà không có người nhận, hãy nghĩ "self ở điểm này là gì? Lớp của nó là gì? Phương thức nào được xác định? Nó bao gồm những mô-đun nào?" Bạn sẽ khám phá ra nhiều điều thú vị về ruby ​​và đường ray. :)

5

Những trình trợ giúp thẻ nội dung đường ray là mô-đun phụ của ActionView, ActionView::Helpers::AssetTagHelper, cung cấp các phương thức tạo HTML liên kết chế độ xem với nội dung như hình ảnh, javascripts, biểu định kiểu và nguồn cấp dữ liệu.

Như modulesclass như một lớp cha nó có nghĩa là AssetTagHelpers cũng sẽ có nó

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 

LƯU Ý: Đối với lợi ích của đơn giản tôi sẽ chỉ tập trung vào các JavascriptIncludeTag nhưng tất cả chúng đều khá giống nhau.

Ở đây bạn sẽ tìm thấy một lớp được gọi là ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag

Mà bạn có thể nhanh chóng

JavascriptIncludeTag.new(config, asset_paths) 

Lớp JavascriptIncludeTag có một phương pháp gọi là asset_tag mà sau đó gọi một phương pháp content_tag và trả thẻ chính xác.

đường dẫn: /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 

đường dẫn: /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 

Vì vậy mà là ít hơn cách họ làm việc.

LƯU Ý: Nếu bạn tìm thấy lời giải thích của tôi một chút khéo léo chỉ cho tôi biết và tôi sẽ chỉnh sửa để cung cấp một lời giải thích tốt hơn

Các vấn đề liên quan