如果Ruby受Smalltalk的强烈影响,我想知道Ruby中是否存在类似于Smalltalk中的printNl
的等效方法?
我非常着迷的想法是,在Smalltalk中,你实际上有一些东西,比如字符串,然后你将消息printNl
(用于使用Newline打印)发送到字符串对象。它是以OOP方式进行的,而不是p obj
或puts obj
的程序方式。
我发现display
只有一个Object
方法,它没有displayNl
替代方法。 Ruby中有一个吗?
为了好玩,我做了以下操作,但我想知道如果它污染Object类可能不好:
class Object
def displayNl
self.display
"\n".display
end
end
"hello world".displayNl
5.displayNl
3.14.displayNl
Time.now.displayNl
Time.displayNl
Fixnum.displayNl
[1,3,5].displayNl
{foo: "bar"}.displayNl
-----------------
$ ruby try.rb
hello world
5
3.14
2015-12-16 14:44:09 -0800
Time
Fixnum
[1, 3, 5]
{:foo=>"bar"}
答案 0 :(得分:3)
我想知道如果污染
,它是否可能不好Object
类
完全!为什么一个对象的责任是将自己打印到控制台?控制台打印字符串的责任是否更有意义?
这正是它在Ruby中的工作原理:IO#print
(和IO#puts
)允许IO
对象将字符串打印到自身,#to_s
协议允许任何对象将自己表示为一个字符串。
Kernel#print
(和Kernel#puts
,Kernel#p
)只是一种便捷方法,基本上如下所示:
module Kernel
private def print(*args)
$>.print(*args)
end
end
$>
是默认输出流,在启动时它与$stdout
和STDOUT
相同,但可以重新分配。它是IO
。
IO#print
看起来像这样:
class IO
def print(*args)
args.map(&:to_s).each do |str|
some_internal_io_method_to_print_strings(str)
# in a C-based Ruby implementation probably calling fputs from the libc
end
end
end
因此,换句话说,Ruby 它是“OO方式”。有IO
个对象知道如何打印字符串,并且有#to_s
方法允许对象将自己表示为字符串。
换句话说:我认为Object#display
是个错误。
您可能会注意到,在YARV中,它实际上是在io.c
中定义的,而不是在object.c
中定义的,所以即使作者似乎也同意此功能属于IO
,而不是{ {1}}。
这是一个相当古老的方法,the oldest trace我找到的是this commit from January, 1999,它似乎来自version 1.3.1 release。在这里,它实际上是defined in Kernel
, not Object
。
在此之前,跟踪会在CVS2SVN转换的迷雾中丢失。
答案 1 :(得分:2)
没有这样的等价物。您的示例是一个有效的实现,但可能不是Ruby中最惯用的。
Ruby方法使用snake_case
而不是camelCase
。此外,在您的方法中使用puts
会更简单,因为puts
会自动附加换行符。
class Object
def display_nl
puts self
end
end
在IRB输入一条长行之后,我经常希望这样的方法。不是将光标移回到行的开头以在所有内容之前添加puts
,而是通常只在下一行使用puts _
。像这样的后缀方法很可爱。