SORU
7 Temmuz 2010, ÇARŞAMBA


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
7 Temmuz 2010, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • We've moved!

    We've moved!

    7 Ocak 2008
  • MagicofRahat

    MagicofRahat

    13 Temmuz 2007
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008