我环顾四周,找不到这个问题:
对于ruby koan 280,它告诉我下面的下划线部分应该是假的:
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
好的,好的。但是,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 :(得分: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/
编辑:忘了添加你怎么知道