在Ruby中,是否有与Smalltalk相同的printNl方法?

时间:2015-12-16 22:48:25

标签: ruby smalltalk

如果Ruby受Smalltalk的强烈影响,我想知道Ruby中是否存在类似于Smalltalk中的printNl的等效方法?

我非常着迷的想法是,在Smalltalk中,你实际上有一些东西,比如字符串,然后你将消息printNl(用于使用Newline打印)发送到字符串对象。它是以OOP方式进行的,而不是p objputs 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"}

2 个答案:

答案 0 :(得分:3)

  

我想知道如果污染Object

,它是否可能不好

完全!为什么一个对象的责任是将自己打印到控制台?控制台打印字符串的责任是否更有意义?

这正是它在Ruby中的工作原理:IO#print(和IO#puts)允许IO对象将字符串打印到自身,#to_s协议允许任何对象将自己表示为一个字符串。

Kernel#print(和Kernel#putsKernel#p)只是一种便捷方法,基本上如下所示:

module Kernel
  private def print(*args)
    $>.print(*args)
  end
end

$>是默认输出流,在启动时它与$stdoutSTDOUT相同,但可以重新分配。它是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)

没有这样的等价物。您的示例是一个有效的实现,但可能不是Ru​​by中最惯用的。

Ruby方法使用snake_case而不是camelCase。此外,在您的方法中使用puts会更简单,因为puts会自动附加换行符。

class Object
  def display_nl
    puts self
  end
end

在IRB输入一条长行之后,我经常希望这样的方法。不是将光标移回到行的开头以在所有内容之前添加puts,而是通常只在下一行使用puts _。像这样的后缀方法很可爱。