我have a class它公开了一个字符串值和一个int值(分别为一个指令输出并退出代码)实现to_int和to_str的。除了通过to_s
和to_i
揭露他们,我还使用to_str
和to_int
,像这样:后果在红宝石
class Status
def to_s
@output
end
alias :to_str :to_s
def to_i
@status.exitstatus
end
alias :to_int :to_i
end
我这背后的想法是能够在尽可能多的情况下,尽可能使用这个对象。让它可以被一个字符串或int强制增加可用性。举例来说,我可以用字符串拼接对象:
a_string = "Output was: " + results
(我想用这个作为INT胁迫,但Fixnum对象的例子+不喜欢它,所以它实际上并没有正常工作: )
an_int = 1 + results
一切到目前为止我读过曾表示,这可能是一个“坏”的事情。常见主题如下所示:“只有当对象基本上是一个字符串/ int”时,才能将对象表示为字符串/ int,但使用to_s
/to_i
。
毫无疑问,我的课不是“根本”的字符串或int。然而, 我有这个规则的一些问题:
- 它使我的班较不灵活/可用。例如:如果我没有Status.to_str,我不能使用String。+连接Status输出和另一个字符串。
- 这似乎违反了鸭子打字的精神。一个对象(即:即得到它作为一个参数的方法)的用户不应该关心什么对象为,它应该只关心什么可以做。 (在这种情况下,“做”是指“可被表示为一个串/ INT”。)
- 为参数“基本上是一个串/ INT”是相当模糊我。例如,您会看到
Float.to_int
被提及很多。故事情节是,由于浮点数始终有一个整数部分,所以to_int
是一个有效的方法。然而,我认为这是虚假的:浮点数是而不是整数(因为它有一个非整数部分),所以试图将它们的“类型”等同起来没有多大意义。你可以合法地转换一个浮点整数(通过截断),但我可以说,我可以我的状态转换为整数,以及(通过“截断”的所有非出口的代码信息)。
所以,我的问题是:有没有真正的(即:实际)实施to_str
和to_int
危害?
更新:JörgW Mittag给了我一个让我想到什么的例子。重新表述的问题是:是否真的需要有to_str
/to_int
当你已经有to_s
/to_i
? (除了特定方法已经预期to_str
超过to_s
的事实)
例如,在Jörg的阵列中。连接示例,数组成员通过to_s转换,而分隔符通过to_str转换。但这真的有必要吗?如果Array.join改为调用separator.to_s,那么您可以成功传递更多的对象(例如:整数,符号等)并获得更大的灵活性。 Ruby是否受益于这种分离?
我在实际的代码中做了这些(请参阅链接的类),但为了简洁起见,我在这里发布的示例代码中省略了这些方法。 – 2009-11-11 21:29:18