module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
Neden ikisi de .
ve ::
var? Neden sadece .
değil?Neden Ruby'de modül işlevlerine erişmenin iki yolu vardır?
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
Neden ikisi de .
ve ::
var? Neden sadece .
değil?Neden Ruby'de modül işlevlerine erişmenin iki yolu vardır?
Kapsam çözüm işleci (::
) sabitleri, örnek yöntemlerini ve sınıf yöntemlerini çözebilir, böylece biz bu operatörü esasen doğru yere baktığımız sürece herhangi bir yöntem için kullanabiliriz.
Ayrıca, "func" yöntemi, A modülünün bir sınıf yöntemi olarak tanımlandığı için (self.func
, "statik" bir yönteme benzer şekilde), doğrudan modüle aittir (kendisi bir nesnedir). alıcı olarak modül ile nokta operatörü ile çağrıldı. Yöntem daha sonra sadece üzerinde nokta operatörüyle adlandırılabilir örnek yöntemi olarak tanımlandı ise
aye = Object.new.extend(A)
aye::funC# raises NoMethodError
aye.func # raises NoMethodError
: Bir sınıf yöntemi olduğundan modül A'nın örnekleri, herhangi görünürlük için "işlev" yok unutmayın modülün örnekleri. Yakut postmodern dil olduğu için
module B
def func2
puts "OK!"
end
end
B::func2 # raises NoMethodError
B.func2 # raises NoMethodError
bee = Object.new.extend(B)
bee::func2 # "OK!"
bee.func2 # "OK!"
@RHSeeger, a şeyler yapmak sadece tek bir şekilde olmak zorunda değildir (ve hatta birden fazla olması daha iyi kabul edilebilir). C, Java ve c'deki gibi minimalist bir dil çekirdeği, Ruby'de gerçekten oyunda değil. –
@Wayne: Yorumu silindi, çünkü asıl sorunun ne olduğunu yanlış anladım. Asıl soru "neden her ikisi de aynı şey olduğu için" olduğunda "farkı nedir" diye okudum. Ben maerics'in cevabını bu kadar açık bir şekilde cevaplamadığından emin değilim, yorumum gerçekten uygun değil. – RHSeeger
Rastgele bir eşgörünüm olarak, "postmodern" in bir programlama dilini etiketlemenin kötü bir yolu olduğu kanaatindeyim. Ruby'yi modern bir programlama dili olarak adlandırırdım. Bu, programlama dili tasarımındaki birçok gelişmeden yararlanmanın hem kullanımı hem de kullanımı kolay bir şey yaratmak için (yani bakımı kolay) yaratması anlamına gelir. Bu söylendiği gibi, Ruby hakkında devrim niteliğinde hiçbir şey yoktur. Dili seviyorum ve diğer dillerden gelen özelliklerin harika bir birleşimi olduğunu düşünüyorum, ancak önceki dillerden bir sıçrama olan masaya getirdiği şeyleri düşünemiyorum. – RHSeeger