Ruby koan 280 - to_str的引用在哪里?

时间:2015-01-13 15:26:10

标签: ruby

我环顾四周,找不到这个问题:
对于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对象。有些方法是否与他们收到的参数类型有关?如果是这样,我该怎么说?

1 个答案:

答案 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/

编辑:忘了添加你怎么知道