- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我have a class它公开了一个字符串值和一个 int 值(分别是命令输出和退出代码)。除了通过 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
我的想法是能够在尽可能多的情况下使用这个对象。将其强制转换为字符串或整数会增加可用性。例如,我可以将对象与字符串连接起来:
a_string = "Output was: " + results
(我想用这个作为 int 强制转换的例子,但是 Fixnum.+ 不喜欢它,所以它实际上不起作用:)
an_int = 1 + results
到目前为止,我读到的所有内容都表明这可能是一件“糟糕”的事情。共同的主题是这样的:“当您的对象可以表示为字符串/整数时使用to_s
/to_i
,但是to_str
/to_int
仅当您的对象基本上是一个字符串/int 时。
毫无疑问,我的类“从根本上”不是字符串或整数。然而我对这条规则有一些疑问:
Float.to_int
。故事是这样的,因为 float 总是有一个整数部分,to_int
是一个有效的方法。但是,我认为这是虚假的: float 不是整数(因为它有一个非整数分量),因此试图将它们的“类型”等同起来没有多大意义。您可以合法地将 float 转换为整数(通过截断),但我可以说我也可以将我的 Status 转换为整数(通过“截断”所有非退出代码信息)。所以,我的问题是:在实现 to_str
和 to_int
时是否有任何真正的(即:实际的)危害?
更新:Jörg W Mittag 举了一个例子让我想到了一些事情。重新表述这个问题:当您已经拥有 to_s
/to_i
时,是否真的需要拥有 to_str
/to_int
? (除了特定方法已经期望 to_str
而不是 to_s
的事实)
例如,在 Jörg 的 Array.join 示例中,数组成员通过 to_s 转换,而分隔符通过 to_str 转换。但这真的有必要吗?如果 Array.join 改为调用 separator.to_s,那么您可以成功地将更多对象传递给它(例如:整数、符号等)并获得更大的灵 active 。 Ruby 是否从这种分离中受益?
最佳答案
It makes my class less flexible/usable. For example: I couldn't use
String#+
to concatenate the Status output with the other string if I didn't haveStatus#to_str
.
这是一个糟糕的例子,因为连接字符串是 Ruby 的不惯用语。字符串插值是首选方式:
a_string = "Output was: #{results}"
这就可以工作™,因为字符串插值实际上会在插值表达式的结果上调用to_s
。
It seems to violate the spirit of duck-typing. The user of an object (ie: a method that gets it as a parameter) shouldn't care what that object is, it should only care what it can do. (In this case, "do" means "can be represented as a string/int".)
我认为“可以表示为字符串/整数”并不是真正的行为。 IOW:“对象可以做什么”是关于特定上下文中的有趣行为,而“可以表示为字符串/整数”并不是真正有趣的行为。
如果您说“Status IS-A Integer”(本质上就是 to_int
的意思),那么您可以用它做算术运算。但是,“将 42 添加到 未找到的文件”意味着是什么意思?成功的对数是多少?失败的平方根是多少?
在上面的字符串插值示例中,有趣的行为是“可以显示”。这基本上是通过实现 #to_s
来表示的。连接两个字符串,OTOH,需要两个字符串。
The arguments for "is fundamentally a string/int" are pretty fuzzy to me. For example, you'll see that
Float#to_int
is mentioned a lot. The story goes that since a floating-point number always has an integer component,to_int
is a valid method. However, I think this is spurious: a Float is not an integer (as it has a non-integer component) and so trying to equate their "typeness" doesn't make much sense. You can legitimately convert a Float to an integer (through truncation), but then I can say that I can convert my Status to an integer as well (by "truncating" all of the non-exit-code information).
同样,这是一个相当薄弱的论点,因为我实际上同意你的观点:那是错误的。
在德国法律中,我们有一个原则很难理解且不直观,但我认为它完美地适用于此。它被称为“Keine Gleichheit im Unrecht”(错误中没有平等)。这意味着宪法赋予的平等基本权利仅在法律范围内适用。换句话说:OJ 并没有使谋杀合法化。
所以,仅仅因为 Ruby 核心库中有垃圾代码(相信我,很多),并不意味着您也可以编写垃圾代码:-)
在这种特殊情况下,Float#to_int
完全错误,不应该存在。 Float
不是 Integer
的子类型。乍一看,情况恰恰相反,即 Integer#to_float
是有效的,但实际上也不是这样:在 Ruby 中,Integer
具有任意精度,但是Float
具有固定精度。 将实现 Fixnum#to_float
是有效的,但那将是一个坏主意,因为 Integer
可以神奇地从 Fixnum 转换
到 BigInteger
并返回,因此 #to_float
方法将“神奇地”出现和消失。
最终帮助我理解to_x
和to_xyz
之间区别的是Array#join
:它打印出数组的元素,由分隔符对象分隔。它通过在数组的每个元素上调用 to_s
并在分隔符上调用 to_str
来实现这一点。一旦您理解了为什么它在一个上调用to_s
并在另一个上调用to_str
,您就基本上设置好了。
(尽管您对 Float#to_int
的评论已经表明您确实理解了。)
旁注:对于代数上下文中的双重分派(dispatch),Ruby 实际上使用 #coerce
协议(protocol)。因此,如果您想让 1 + a_status
示例正常工作,您需要实现 Status#coerce
。但是,请不要。
关于ruby - 在 Ruby 中实现 to_int 和 to_str 的后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718043/
以下是一个非常简单的ruby服务器。 require 'socket' local_socket = Socket.new(:INET, :STREAM) local_addr = Socket.
我正在使用 OS X(使用 bash),并且是 unix 的新手。我想知道是否可以修改一些文件以便运行 ruby 程序,我不需要“ruby file.rb”,而是可以运行“ruby.rb”。 有理
我在用 Ruby 替换字符串时遇到一些问题。 我的原文:人之所为不如兽之所为。 我想替换为:==What== human does is not like ==what== animal does.
我想在一个循环中从 Ruby 脚本做这样的事情: 写一个文件a.rb(每次迭代都会改变) 执行系统(ruby 'a.rb') a.rb 将带有结果的字符串写入文件“results” a.rb 完成并且
我的问题是尝试创建一个本地服务器,以便我可以理解由我的新团队开发的应用程序。我的问题是我使用的是 Ruby 2.3.3,而 Gemfile 需要 2.3.1。我无法编辑 Gemfile,因为我被告知很
我有一个使用 GLI 框架用 Ruby 编写的命令行实用程序。我想在我的主目录中配置我的命令行实用程序,使用 Ruby 本身作为 DSL 来处理它(类似于 Gemfile 或 Rakefile)。 我
我的 Rails 应用 Controller 中有这段代码: def delete object = model.datamapper_class.first(:sourced_id =>
我正在寻找的解析器应该: 对 Ruby 解析友好, 规则设计优雅, 产生用户友好的解析错误, 用户文档的数量应该比计算器示例多, UPD:允许在编写语法时省略可选的空格。 快速解析不是一个重要的特性。
我刚开始使用 Ruby,听说有一种“Ruby 方式”编码。除了 Ruby on Rails 之外,还有哪些项目适合学习并被认可且设计良好? 最佳答案 Prawn被明确地创建为不仅是一个该死的好 PDF
我知道之前有人问过类似的问题,但是我该如何构建一个无需在前面输入“ruby”就可以在终端中运行的 Ruby 文件呢? 这里的最终目标是创建一个命令行工具包类型的东西。现在,为了执行我希望用户能够执行的
例如哈希a是{:name=>'mike',:age=>27,:gender=>'male'}哈希 b 是 {:name=>'mike'} 我想知道是否有更好的方法来判断 b 哈希是否在 a 哈希内,而
我是一名决定学习 Ruby 和 Ruby on Rails 的 ASP.NET MVC 开发人员。我已经有所了解并在 RoR 上创建了一个网站。在 ASP.NET MVC 上开发,我一直使用三层架构:
最近我看到 Gary Bernhardt 展示了他用来在 vim 中执行 Ruby 代码的 vim 快捷方式。捷径是 :map ,t :w\|:!ruby %. 似乎这个方法总是执行系统 Rub
在为 this question about Blue Ruby 选择的答案中,查克说: All of the current Ruby implementations are compiled to
我有一个 Ruby 数组 > list = Request.find_all_by_artist("Metallica").map(&:song) => ["Nothing else Matters"
我在四舍五入时遇到问题。我有一个 float ,我想将其四舍五入到小数点后的百分之一。但是,我只能使用 .round ,它基本上将它变成一个 int,意思是 2.34.round # => 2. 有没
我使用 ruby on rails 编写了一个小型 Web 应用程序,它的主要目的是上传、存储和显示来自 xml(文件最多几 MB)文件的结果。运行大约 2 个月后,我注意到 mongrel 进程
我们如何用 Ruby 转换像这样的字符串: 𝑙𝑎𝑡𝑜𝑟𝑟𝑒 收件人: Latorre 最佳答案 s = "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" => "𝑙𝑎𝑡𝑜𝑟𝑟𝑒" s.u
通过 ruby monk 时,他们偶尔会从左侧字段中抛出一段语法不熟悉的代码: def compute(xyz) return nil unless xyz xyz.map {|a,
不确定我做错了什么,但我似乎弄错了。 问题是,给你一串空格分隔的数字,你必须返回最大和最小的数字。 注意:所有数字都是有效的 Int32,不需要验证它们。输入字符串中始终至少有一个数字。输出字符串必须
我是一名优秀的程序员,十分优秀!