2015-01-13 56 views
0

我已經環顧四周,找不到這樣的問題:
爲Ruby公案280它告訴我下面的下劃線部分應該是假的:Ruby koan 280 - 哪裏是to_str的引用?

def test_to_str_allows_objects_to_be_treated_as_strings 
    assert_equal __, File.exist?(CanBeTreatedAsString.new) # test passes, if __ is changed to false 
    end 

OK,挺好的。但是,如何測試to_str允許將對象視爲字符串?這裏是CanBeTreatedAsString類,它不包括to_str方法:

class CanBeTreatedAsString 
    def to_s 
     "string-like" 
    end 

    def to_str 
     to_s 
    end 
    end 

...但怎麼就是有關上述assert_equal代碼?是.exist?期望一個字符串? 此頁面:
http://www.ruby-doc.org/core-2.2.0/File.html#method-c-exist-3F
說參數可以是一個IO對象。是否有一些特定的方法來獲取它們所接受的參數類型如果是這樣,我怎麼說?

回答

0

File.exist?需要一個字符串或一個IO。部分原因是通過在對象上調用to_str。一個字符串返回to_str。否則,它只應該在可用作字符串的對象上實現。

由於Ruby的鴨子打字慣例,沒有一種簡單的方法可以告訴。但是,通常如果一個方法接受一個字符串,那麼它會調用String.try_convert(它使用to_str)來允許輸入鴨子。以類似的方式,許多對象期望int調用Integer.try_convert(它調用to_int)來轉換參數。

這裏有各種轉換協議的更多信息:http://pivotallabs.com/messages-not-types-exploring-rubys-conversion-protocols/

編輯:忘了加上你怎麼能告訴