我目前正在读一本书,上面写着STDOUT
是一个常数。我的问题是它是什么样的对象?
当我说[1,2] << 3
时,我知道<<
类中定义了Array
。
当我输入这样的代码时:
STDOUT << "string" << "\n"
<<
常量上STDOUT
的定义是什么?
答案 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
对象。