Simple Emptiness

Дима • 31 марта 2007 г.

На днях мне пришла в голову идея которая показалась мне интересной.

Для строк:

"" | "default"                         # "default"
"      \n" | "default"                 # "default"
"  blah  " | "default"                 # "  blah  "

Для хешей:

{} | {:default => :value}              # {:default => :value}

Для других объектов:

false | "something"                    # "something"
nil | "something"                      # "something"
true | false                           # true
{:pi => 3.1416} | {:pi => 3.14159265}  # {:pi => 3.1416}

Для массивов работать не будет, у них уже есть метод |, который объединяет два массива удаляя дубликаты.

Также, ещё один недостаток это то, что данный способ не предполагает lazy evaluation, то есть следующий код вызовет и some_method() и redundant_method() при любом условии:

value = some_method() | redundant_method()

А вообще, всё это было сделано для того, чтобы сократить количество строк при следующем действии:

@plan = params[:plan_name].to_s.strip.empty? ? "Not given." : params[:plan_name]

До:

@plan = params[:plan_name] | "Not given."

Ну а потенциально может пригодиться и в множестве других случаев.

Скачать файл с кодом можно здесь: simple_emptiness.rb

У кого есть предложения по поводу того как это можно ещё использовать или улучшить?

Update: по поводу замечания насчет возможного использования метода blank? (из ActiveSupport) вместо цепочки to_s.strip отмечу, что код писался с расчетом на возможное использование и в pure ruby проектах, поэтому решено было зависимости сократить по минимуму.

8 комментариев:

  1. Mash:

    def some_method true end def redundant_method false end puts some_method() || redundant_method()

  2. Mash:

    А, пардон, перечитал, не о том, видимо. :)

  3. Julik:

    Простите, а Object#blank? для кого сотворили?

  4. Дмитрий:

    Да я в курсе про blank?-то. Просто опять же,

    something.blank? ? something : “default”

    и

    something | “default”

    выглядят немного иначе. Плюс мне нравится ассоциация с рубишным ||. Я предложил syntax sugar, nothing more.

  5. Julik:

    Так я не против, только зачем все остальное кроме Object если есть blank?

    class Object end

    def |(oth)
      self.blank? ? oth : self
    end

    и дело к стороне

  6. Des:

    Понравилось :)

  7. Дмитрий:

    :))

  8. DEkart:

    Ай какая полезная штука :) Шпашыба

Извините, но комментарии для этой статьи уже закрыты.