为什么Rails实现String#starts_with方法?而不是start_with的别名?

时间:2011-11-07 23:32:37

标签: ruby-on-rails ruby activesupport

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 个答案:

答案 0 :(得分:4)

从您的代码中,看起来您手头有一个非常旧版本的Rails(&lt; = 2.3.5)。由于此版本支持较旧的Ruby版本,但尚未使用start_with?,因此他们手动实现了它。

但是,如果您在文件中查看上面的内容,您会看到他们使用了ruby内置方法(如果可用)。在删除了Ruby 1.8.6支持的较新Rails版本中,这些魔术位were removed和ActiveSupport现在提供了无条件别名。