2012-06-15 21 views
35

Olası Çoğalt çağırmak için (çift kolon vs nokta):
What does :: mean in Ruby?. vs :: Bir yöntemini

ben Poignant Guide to Ruby gelen ve kod örnekleri bazılarında Ruby öğreniyorum, yukarıdaki kodda

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

: Ben de aynı amaçla kullanılabilir görünmektedir çift kolon ve noktanın kullanımları geldi çift ​​kolon, File sınıfının open yöntemine erişmek için kullanılıyor. Ancak, daha sonra aynı amaç için bir nokta kullanılan kod rastladım:

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 

Bu süre, bir nokta File sınıfının read yöntemini erişmek için kullanılıyor.

File.read() 

ve

File::open() 
+0

bakınız [nedir Ruby'nin çift kolon (?: :) hepsi hakkında] (http://stackoverflow.com/questions/3009477/what-is-rubys- çift ​​kolon tüm ilgili). – sczizzo

+26

Gerçekten bunun bir kopyası olduğunu sanmıyorum. Bu soruyu ya da cevaplarını hiçbir yerde, tartışılan tekil yöntemlerle ilgili olarak '' 'kullanımı yoktur. –

+8

Katılıyorum. Bunu açmadan önce başka bir soru gördüm. Ancak, benim soruma cevap açıkça verilmiyordu. Diğer soru sadece :: operatörünün kullanımını tartışır. Belki de nokta operatörünün kullanımıyla ilgili ipuçlarını ince bir şekilde kullanırsınız, fakat bir şeye yeni olduğunuz zaman, cevaba çok farklı bir biçimde ihtiyacınız vardır. Ve belirttiğim gibi, yakut için yeniyim. – flyingarmadillo

cevap

21

Bu scope resolution operator var: arasındaki fark nedir.

Wikipedia'dan bir örnek:

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

Bu, şu soruya cevap vermiyor: "File.read()" ve "File :: open()'? "arasındaki fark nedir? Ve neden her ikisi de bir yöntemi çağırmak için kullanılabilir? Ne zaman diğerinden birini seçerdik? – antinome

+26

:: ile arasında fark yok. işlevselliği sınıf (statik) yöntemleri çağırırken. Ancak, nokta kullanamayacağınız sabitlere ve diğer adlara erişmek için :: kullanabilirsiniz. Ben şahsen her zaman nokta kullanıyorum, ama meslektaşım kullanıyorum: statik yöntemleri çağırmak için. Belki de Foo :: Bar :: open (Foo :: Bar.open yerine) gibi ad alanlarını çağırdığınızda estetik olarak daha güzeldir, ancak her iki yöntemde de aynı şekilde çalışır. Performans da aynı. Not; İşte bu konuda güzel tartışma: https://www.ruby-forum.com/topic/107527 –

+8

@DaliborFilus yorum kabul edilen cevap olmalı, gerçekten ... –

İlgili konular