2011-11-07 43 views
2

Ruby on Rails的具有方法String#starts_with?,這是Ruby實現與爲什麼Rails實現String#starts_with方法?而不是別名start_with?

# 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 

而紅寶石,由於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?到鏈接的別名?

他們是否希望保持與Ruby 1.8.6的兼容性,還是擔心可能與starts_with?有不同的行爲,或者他們沒有看到需要更新代碼?

回答

4

從你的代碼看來,你手頭上有一個非常老的Rails版本(< = 2.3.5)。由於此版本支持較早的Ruby版本,所以尚未有他們手動實現它。

但是,如果您在文件中查看上述內容,您會發現他們使用了ruby內置方法(如果可用)。在Ruby 1.8.6支持被刪除的新版Rails版本中,這些神奇的比特were removed和ActiveSupport現在提供了無條件的別名。

+0

我在看http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/StartsEndsWith.html - 那個文檔過時了嗎? –

+2

是的,去http://as.rubyonrails.org,你會看到它是從2008年。目前使用的網站是http://api.rubyonrails.org –

+1

Ouch。文檔失敗。如果舊網站將所有請求都包裝在一個表明它已過期的框架中,將會很好... – DGM

相關問題