2012-06-15 23 views
35

thể trùng lặp:
What does :: mean in Ruby?. vs :: (dot vs đúp dấu hai chấm) để gọi một phương pháp

Tôi đang học Ruby từ Poignant Guide to Ruby và trong một số ví dụ mã, Tôi đã xem xét việc sử dụng dấu hai chấm và dấu chấm dường như được sử dụng cho cùng một mục đích:

File::open('idea-' + idea_name + '.txt', 'w') do |f| 
    f << idea 
end 

Trong đoạn mã trên, dấu hai chấm đang được sử dụng để truy cập phương thức open của lớp File. Tuy nhiên, sau đó tôi đi qua mã mà sử dụng một dấu chấm cho cùng một mục đích:

require 'wordlist' 
# Print each idea out with the words fixed 
Dir['idea-*.txt'].each do |file_name| 
    idea = File.read(file_name) 
    code_words.each do |real, code| 
    idea.gsub!(code, real) 
    end 
puts idea 
end 

thời gian này, một dấu chấm đang được sử dụng để truy cập vào các phương pháp read của lớp File.

File.read() 

File::open() 
+0

Xem [Thế nào là Ruby đúp dấu hai chấm (: :) tất cả về] (http://stackoverflow.com/questions/3009477/what-is-rubys- hai dấu hai chấm). – sczizzo

+26

Tôi thực sự không nghĩ rằng đây là một bản sao của điều đó. Không nơi nào trong câu hỏi đó hoặc câu trả lời của nó là việc sử dụng '::' đối với các phương thức singleton được thảo luận. –

+8

Tôi đồng ý. Tôi đã thấy một câu hỏi khác trước khi tôi mở câu hỏi này. Tuy nhiên, câu trả lời cho câu hỏi của tôi không được đưa ra một cách rõ ràng. Câu hỏi khác thảo luận về việc sử dụng chỉ của toán tử ::. Có thể gợi ý của nó về việc sử dụng toán tử dấu chấm một cách tinh tế, nhưng khi bạn mới làm quen với cái gì đó, bạn cần câu trả lời dưới dạng rất khác biệt. Và như tôi đã nói, tôi mới làm quen với ruby. – flyingarmadillo

Trả lời

21

Đó là scope resolution operator: Sự khác nhau giữa là gì.

Một ví dụ từ Wikipedia:

module Example 
    Version = 1.0 

    class << self # We are accessing the module's singleton class 
    def hello(who = "world") 
     "Hello #{who}" 
    end 
    end 
end #/Example 

Example::hello # => "Hello world" 
Example.hello "hacker" # => "Hello hacker" 

Example::Version # => 1.0 
Example.Version # NoMethodError 

# This illustrates the difference between the message (.) operator and the scope 
# operator in Ruby (::). 
# We can use both ::hello and .hello, because hello is a part of Example's scope 
# and because Example responds to the message hello. 
# 
# We can't do the same with ::Version and .Version, because Version is within the 
# scope of Example, but Example can't respond to the message Version, since there 
# is no method to respond with. 
+18

Điều này không trả lời câu hỏi: "sự khác biệt giữa' File.read() 'và' File :: open() 'là gì?". Và tại sao cả hai có thể được sử dụng để gọi một phương pháp? Khi nào chúng ta chọn cái kia? – antinome

+26

Không có sự khác biệt giữa :: và. khi gọi các phương thức lớp (tĩnh) trong chức năng. Nhưng bạn có thể sử dụng :: để truy cập các hằng số và các thứ không gian tên khác, mà bạn không thể sử dụng dấu chấm. Cá nhân tôi sử dụng dấu chấm tất cả thời gian, nhưng đồng nghiệp của tôi sử dụng :: để gọi phương thức tĩnh. Có thể nó đẹp hơn một chút về mặt thẩm mỹ khi bạn gọi điều không gian tên, như Foo :: Bar :: mở (thay vì Foo :: Bar.open), nhưng nó hoạt động giống nhau theo cả hai cách. Hiệu suất cũng vậy. P.S. Đây là cuộc thảo luận thú vị về chủ đề này: https://www.ruby-forum.com/topic/107527 –

+8

@DaliborFilus bình luận nên là câu trả lời được chấp nhận, thực sự ... –

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