Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NULLに関する一考察 #TechLunch

NULLに関する一考察 #TechLunch

2011/10/05(水) @ Livesense TechLunch
発表者:桂 大介

E60aa4f80303f3f386898546ddb3686a?s=128

Livesense Inc.
PRO

April 23, 2014
Tweet

Transcript

  1. NULL に関する ー 考 察 katsura@livesense.co.jp

  2. NULL に関する ー 考 察 katsura@livesense.co.jp

  3. /nʌl/

  4. nullus

  5. From ne (“not”) + ūllus (“any”), literally meaning "not any".

  6. Differences in dealing with null

  7. null = undefined

  8. PHP $value // null isset($value) // false is_null($value) // true

    $value === null // true unset($value) $value = null $hash = array('key' => null) array_key_exists('key', $hash) // true isset($hash['key']) // false
  9. Perl 5 $value // undef defined $value // false undef

    $value
  10. Perl 6 my $value $value // Any() $value = Nil

    $value // Any() $value.defined // Bool::False
  11. null and undefined

  12. Javascript value; // undefined typeof value === 'undefined' // true

    value === void 0 // true value = void 0; value = null value === null // true
  13. null only

  14. Ruby value // NameError defined? value // nil(false?) undef value

    value = nil value.nil? // true
  15. Python value // NameError del value value = None value

    is None // true
  16. wrapped null

  17. Scala Option v1 = Some(1) v2 = None v1.getOrElse(2) //

    1 v2.getOrElse(2) // 2
  18. Haskell Maybe v1 = Just 1 v2 = Nothing getValueOrTwo

    v = case v of Just x -> x Nothing -> 2 getValueOrTwo v1 // 1 getValueOrTwo v2 // 2
  19. int main() { for(int j=-5; j<=5; ++j) { optional<int> x

    = sqrt(j); if( x ) cout << *x << endl; else cout << "invalid" << endl; } } boost::optional
  20. boxing

  21. C# nullable int? value = null value.HasValue // false Nullable.GetValueOrDefault(value,

    123) // 123 Value ?? 123 // 123
  22. making null

  23. C++ nullptr const class nullptr_t { public: template<class T> operator

    T*() const { return 0; } template<class C, class T> operator T C::*() const { return 0; } private: void operator&() const; } nullptr = {};
  24. One more thing

  25. void f( tribool b ) { if( b ) cout

    << "True" << endl; else if( !b ) cout << "False" << endl; else cout << "Indeterminate" << endl; } int main() { tribool x = indeterminate; f(x); // Indeterminate f(true && x); // Indeterminate f(true || x); // True } boost::logic::tribool
  26. 考察 • null は必要だけど null チェック地獄 • null と値でインターフェースを合わせるのが時 代の流れ

    • →Option, nullable • →coffee script • →presence • →null object pattern
  27. 次回予告

  28. None