Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Открытые классы в ruby, заметки для питонистов

Anna | 15.06.2014 | нет комментариев
По своему навыку знаю, что открытые классы в ruby нервируют и вызывают недопонимание в среде питонистов. Ну в самом деле, что за странность открыть класс String и переопределить там size?

А дозволено разглядеть вопрос в иной стороны, испробуем разобрать маленький пример. Все знают как в python различные типы проверяются на истинность — всё что пусто, то вранье. В ruby это не так, тут вранье это nil и false. Изредка было бы комфортнее как в python.

Как это дозволено решить скажем в rust, включая поддержку для встроенных типов:

trait Existable {
  fn exist(&self) -> bool;
}

impl Existable for int {
  fn exist(&self) -> bool { if *self == 0 { false } else { true } }
}

fn main () {
  assert!(5.exist() == true)
  assert!(0.exist() == false)
}

Предположим что в python схема не такая, и мы хотим ее реализовать. В python невозможно определить новые способы для сторонних классов, следственно дозволено сделать что-то как бы:

class Trait(object):
    def __init__(self):
        self.registry = {}

    def impl(self, typ):
        def reg(func):
            self.registry[typ] = func
            return func
        return reg

    def __call__(self, arg):
        return self.registry[arg.__class__](arg)

Existable = Trait()

@Existable.impl(int)
def int_exists(i):
    return False if i == 0 else True

if __name__ == '__main__':
    assert Existable(0) == False
    assert Existable(5) == True

Ну либо применять какую-нибудь библиотеку, которая толковее минутного очерка.

Как в ruby реализовали сходственную штуку?

class Object
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 13
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

Способ `empty?` определен на классах `Array` и `Hash` (как минимум). Определите на своем классе и способ `blank?` будет правильно трудиться. То есть тут мы имеем trait в ruby — объекты отвечающие на `empty?` реализуют trait проверки на пустоту, тот самый `Existable`.

Это примитивный правильный пример применения открытых классов в ruby, а есть и много других восхитительных штук из ActiveSupport, одной из частей Ruby on Rails.

Верю вследствие такому простому примеру, вы сейчас понимаете, что открытые классы в ruby совсем не зло, а пригодный инструмент, тот, что в прямых руках разрешает реализовывать растяжения среды грациозно.

Если было не вовсе ясно, что я имею в виду — открытые классы в ruby разрешают доопределять поведение всяких, встроенных в том числе, классов, также как и traits в rust и других языках.

PS Я не утверждаю что в python невозможно реализовать сходственный механизм — я простенький пример даже привел в самой статье. Еще раз — речь о положительном применении открытых классов в ruby, а не о превосходствах какого-либо языка перед иным.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB