2012-06-15 2 views
35

Mögliche Duplizieren:
What does :: mean in Ruby?. vs :: (dot vs. Doppelpunkt) für den Aufruf einer Methode

Ich lerne Rubin vom Poignant Guide to Ruby und in einigen der Codebeispiele, ich kam über Verwendungen des doppelten Doppelpunkt und Punkt, der für den gleichen Zweck verwendet werden, scheinen:

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

In dem obigen Code, der doppelter Doppelpunkt wird verwendet, um auf die open-Methode der Klasse File zuzugreifen. Ich jedoch später über Code kam, die einen Punkt für den gleichen Zweck verwendet:

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 

dieser Zeit wird ein Punkt der read Methode der File Klasse zuzugreifen verwendet wird. Was ist der Unterschied zwischen:

File.read() 

und

File::open() 
+0

See [Was ist Rubys Doppelpunkt (:? :) alles um] (http://stackoverflow.com/questions/3009477/what-is-rubys- Doppelpunkt-Alleskönner). – sczizzo

+26

Ich glaube wirklich nicht, dass dies ein Duplikat davon ist. Nirgendwo in dieser Frage oder ihren Antworten ist die Verwendung von '::' in Bezug auf Singleton-Methoden diskutiert. –

+8

Ich stimme zu. Ich sah diese andere Frage, bevor ich diese öffnete. Die Antwort auf meine Frage wurde jedoch nicht explizit gegeben. Die andere Frage diskutiert die Verwendung nur des :: -Operators. Vielleicht deutet es auf die Verwendung des Punktoperators auf subtile Weise hin, aber wenn man neu ist, braucht man die Antwort in einer sehr unterschiedlichen Form. Und wie ich schon sagte, ich bin neu in Ruby. – flyingarmadillo

Antwort

21

Es ist die scope resolution operator.

Ein Beispiel aus 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

Dies beantwortet nicht die Frage: "Was ist der Unterschied zwischen' File.read() 'und' File :: open() '?". Und warum können beide verwendet werden, um eine Methode aufzurufen? Wann würden wir eins über das andere wählen? – antinome

+26

Es gibt keinen Unterschied zwischen :: und. beim Aufruf von (statischen) Klassenmethoden in der Funktionalität. Sie können aber :: verwenden, um auf Konstanten und andere Namespaced-Dinge zuzugreifen, für die Sie keinen Punkt verwenden können. Ich benutze persönlich immer Punkt, aber mein Kollege benutzt :: um statische Methoden aufzurufen. Vielleicht ist es etwas ästhetischer, wenn man Namespaced-Dinge wie Foo :: Bar :: open (statt Foo :: Bar.open) aufruft, aber es funktioniert in beiden Richtungen. Die Leistung ist auch gleich. P.S. Hier ist eine nette Diskussion zu diesem Thema: https://www.ruby-forum.com/topic/107527 –

+8

@DaliborFilus Kommentar sollte die akzeptierte Antwort sein, wirklich ... –

Verwandte Themen