Neden Ruby tek bir Boolean sınıfı yerine TrueClass ve FalseClass var mı?
Bu öğrendiğinde değerleri seri üzerinde çalışıyordum. Ruby TrueClass
bir sınıf, ve FalseClass
dersi var, Boolean
hiçbir sınıf vardır. Bu yüzden bilmek istiyorum.
Boolean
; örneğin, dize ayrıştırma üzerinde merkezi olabilir kullanarak bazı avantajlar görüyorum.
Ruby geliştiricileri benden zeki, ben görmüyorum bir sürü sebep olmalı. Ama şu anda OneClass
ve Fixnum
yerine TwoClass
Bir sahip gibi görünüyor.
CEVAP
Bir sınıfın amacı, benzer bir davranış ile benzer nesne ya da nesneleri birleştirebilir. 1
2
çok benzer, bu nedenle onlarla aynı sınıfta olmak için çok mantıklı geldi. true
false
ancakdeğilbenzer. Aslında, onlarınbütün meseleaynen . olmasıdır ^em>tam tersibirbirlerine zıt davranış. Bu nedenle, aynı sınıfa ait değiller.
Boolean
bir sınıfta uygulamak örnek verebilir misiniz? Hiçbir şey düşünemiyorum.
TrueClass
FalseClass
Bu davranış, at hadi bakalım: tam olarakdörtyöntemleri var. Hayır daha fazla. Ve her durumda, iki yöntemtam tersi. Nasıl ve neden tek bir sınıfta koyabilir misiniz?
Nasıl tüm bu yöntemleri uygulamak: burada
class TrueClass
def &(other)
other
end
def |(_)
self
end
def ^(other)
!other
end
def to_s
'true'
end
end
Ve şimdi tam tersi:
class FalseClass
def &(_)
self
end
def |(other)
other
end
def ^(other)
other
end
def to_s
'false'
end
end
Kabul ediyorum, Yakut, orada pek çok "sihirli" oluyor perde arkası bu değil aslında idare tarafından TrueClass
FalseClass
ama oldukça inatçı haline tercüman. , *, *24if
&&
ve !
gibi şeyler. Ancak, Smalltalk, Ruby, hangi ödünç olmak üzere bir çok kavramı FalseClass
TrueClass
bütün bunlar uygulanan yöntemler de, ve aynı şeyi Yakut:
class TrueClass
def if
yield
end
def ifelse(then_branch=->{}, _=nil)
then_branch.()
end
def unless
end
def unlesselse(_=nil, else_branch=->{})
ifelse(else_branch, _)
end
def and
yield
end
def or
self
end
def not
false
end
end
Ve yine tam tersi:
class FalseClass
def if
end
def ifelse(_=nil, else_branch=->{})
else_branch.()
end
def unless
yield
end
def unlesselse(unless_branch=->{}, _=nil)
ifelse(_, unless_branch)
end
def and
self
end
def or
yield
end
def not
true
end
end
Birkaç yıl önce, sadece eğlence için yukarıda ve even published it yazdım. Sözdizimi Ruby sadece yöntemleri kullanırken özel operatörler kullandığından farklı görünüyor olması dışında, tam olarak Ruby'nin yerleşik operatörler gibi davranır. Aslında, ben aslında the RubySpec conformance testsuite ported it over to my syntax aldı ve geçer.
Neden #sadece 1 yerine C boolean bir m...
Neden Ruby bölümü yerine tamsayı ondal...
Neden nesne yerine bir işaretçi kendis...
Python katılın, neden dize.liste yerin...
Neden Ruby Hariç => e `kurtarmak iç...