在哪里<<为STDOUT定义?

时间:2015-04-21 04:32:12

标签: ruby

我目前正在读一本书,上面写着STDOUT是一个常数。我的问题是它是什么样的对象?

当我说[1,2] << 3时,我知道<<类中定义了Array

当我输入这样的代码时:

STDOUT << "string" << "\n"

<<常量上STDOUT的定义是什么?

4 个答案:

答案 0 :(得分:1)

<<通常以追加的形式实现。对于数组,<<表示在数组的末尾附加一个元素,对于字符串,<<表示将给定的对象附加到字符串的末尾等。

IO#<<类似,将给定对象写入IO流,就像C ++中的std::stdout << "hello" << std::endl;一样。

答案 1 :(得分:0)

你提出的问题比你想象的要复杂得多(或许不是);)

常量是值不会改变的东西......在这种情况下 - 我们经常指向类IO的实例(在这种情况下是转到'标准输出'的实例)

该实例不会更改 - 即我们没有为其分配一些新的IO ...

我们正在做的是调用<<方法。在这种情况下,您可以将一串字符串传递给它...然后输出字符串 到标准输出。

答案 2 :(得分:0)

<< stdout的{​​{1}}的定义可以找到here

VALUE rb_io_addstr(VALUE io, VALUE str)
{
    rb_io_write(io, str);
    return io;
}

是的,STDOUT是Ruby中的常量,可以更改,但会发出警告。所以理想情况下不应该改变。

STDOUT = $stderr (irb):1: warning: al#=> #<IO:<STDERR>>constant STDOUT >> STDOUT #=> #<IO:<STDERR>>

当您在<<上执行STDOUT时,您正在调用<<上定义的函数STDOUT,请勿与此混淆您正在更改STDOUT,您基本上是在输出流中附加。

答案 3 :(得分:0)

正如所指出的,STDOUT是一个常量,它是类IO的一个实例,它是Ruby标准库的一部分。 IO个对象用于包装允许您读取和写入不同文件的流。 (在UNIX系统上,所有设备都被视为文件。)默认输入(STDIN)是键盘,默认输出(STDOUT)是终端。

IO类只是一个常规的Ruby类,它的方法(包括<<)在Ruby documentation中定义。但是,<<上的文档有点稀疏,并且遗漏了任何较低级别的详细信息:

  

ios&lt;&lt; obj→ios

     

字符串输出---将obj写入ios。 obj将使用to_s转换为字符串。

还有一组全局变量$stdin$stdout,它们对应于常量。默认情况下,这些将指向它们各自的常量,但可以更改,而常量将始终指向默认的流IO对象。