Почему Rails реализует метод String # start_with?а не псевдоним start_with? - PullRequest
2 голосов
/ 08 ноября 2011

Ruby on Rails имеет метод String#starts_with?, который реализован в Ruby с

# File lib/active_support/core_ext/string/starts_ends_with.rb, line 22
def starts_with?(prefix)
  prefix = prefix.to_s
  self[0, prefix.length] == prefix
end

, тогда как Ruby, начиная с версии 1.8.7, имеет метод String#start_with?, который реализован в C

static VALUE
rb_str_start_with(int argc, VALUE *argv, VALUE str)
{
    int i;

    for (i=0; i<argc; i++) {
        VALUE tmp = rb_check_string_type(argv[i]);
        if (NIL_P(tmp)) continue;
        rb_enc_check(str, tmp);
        if (RSTRING_LEN(str) < RSTRING_LEN(tmp)) continue;
        if (memcmp(RSTRING_PTR(str), RSTRING_PTR(tmp), RSTRING_LEN(tmp)) == 0)
            return Qtrue;
    }
    return Qfalse;
}

Почему у них просто нет псевдонима, связывающего от starts_with? до start_with??

Они хотят поддерживать совместимость с Ruby 1.8.6, или они обеспокоены тем, что start_with? может вести себя иначе, чем starts_with?, или они не видели необходимости обновлять код?

1 Ответ

4 голосов
/ 08 ноября 2011

Из вашего кода похоже, что у вас под рукой действительно старая версия Rails (<= 2.3.5). Поскольку эта версия поддерживала более старые версии Ruby, у которых еще не было <code>start_with?, они реализовали это вручную.

Однако если вы посмотрите выше в файле, вы увидите, что они использовали встроенный метод ruby, если он доступен. В более новых версиях Rails, где поддержка Ruby 1.8.6 была удалена, эти магические биты были удалены , и ActiveSupport теперь предоставляет безусловные псевдонимы.

...