Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解ruby方法$stdout的工作原理_Ruby_Stdout - Fatal编程技术网

了解ruby方法$stdout的工作原理

了解ruby方法$stdout的工作原理,ruby,stdout,Ruby,Stdout,下面是一个简单的ruby脚本,它接受用户的输入并提供输出(是的,它将被重构)。我希望这个脚本将输出提供到文本文件中,而不是控制台窗口。这是通过简单地添加$stdout=File.new('out.txt','w')实现的,但我认为这一行将只描述一个变量,稍后我将使用它告诉脚本使用它将输出写入创建的文件 我找不到很多关于这个方法的文档,我想知道这个程序如何知道如何将生成的输出写入那个文件 $stdout是一个全局变量(如$所示),根据文档,它是: 相当于 $stdout.puts(obj, ...

下面是一个简单的ruby脚本,它接受用户的输入并提供输出(是的,它将被重构)。我希望这个脚本将输出提供到文本文件中,而不是控制台窗口。这是通过简单地添加
$stdout=File.new('out.txt','w')
实现的,但我认为这一行将只描述一个变量,稍后我将使用它告诉脚本使用它将输出写入创建的文件


我找不到很多关于这个方法的文档,我想知道这个程序如何知道如何将生成的输出写入那个文件

$stdout
是一个全局变量(如
$
所示),根据文档,它是:

相当于

$stdout.puts(obj, ...)
如果将另一个对象分配给
$stdout
,则
内核#put
将只向该对象发送
put
。同样,
print
将发送
write

class Foo < BasicObject
  def puts(*args)
    ::STDOUT.puts "Foo#puts called with #{args.inspect}"
  end

  def write(*args)
    ::STDOUT.puts "Foo#write called with #{args.inspect}"
  end
end

$stdout = Foo.new

puts 'hello', 'world'
# Foo#puts called with ["hello", "world"]
print "\n"
# Foo#write called with ["\n"]
class Foo

请注意,如果指定给
$stdout
,Ruby将检查对象是否响应
写入
。如果不是,将引发
类型错误。

$stdout
是一个全局变量(如
$
所示),根据文档,它是:

相当于

$stdout.puts(obj, ...)
如果将另一个对象分配给
$stdout
,则
内核#put
将只向该对象发送
put
。同样,
print
将发送
write

class Foo < BasicObject
  def puts(*args)
    ::STDOUT.puts "Foo#puts called with #{args.inspect}"
  end

  def write(*args)
    ::STDOUT.puts "Foo#write called with #{args.inspect}"
  end
end

$stdout = Foo.new

puts 'hello', 'world'
# Foo#puts called with ["hello", "world"]
print "\n"
# Foo#write called with ["\n"]
class Foo

请注意,如果指定给
$stdout
,Ruby将检查对象是否响应
写入
。否则,将引发
类型错误。

$stdout
是一个全局变量。默认情况下,它存储与程序的标准输出(默认情况下为控制台)关联的类型的对象

是的一个方法,它实际调用
$stdout.send()
,并将收到的参数列表传递给它。如文档所述,
put(obj,…)
相当于
$stdout.put(obj,…)

您的代码将
$stdout
替换为扩展类
IO
类型的对象。创建对象时,对象会打开文件
out.txt
进行写入,并与其从
IO
继承的内容完全兼容
$stdout
的默认行为


由于默认情况下,所有输出都会转到
$stdout
,因此
$stdout
的新定义确保将输出写入文件
out.txt
,而不会对代码进行其他更改。

$stdout
是一个全局变量。默认情况下,它存储与程序的标准输出(默认情况下为控制台)关联的类型的对象

是的一个方法,它实际调用
$stdout.send()
,并将收到的参数列表传递给它。如文档所述,
put(obj,…)
相当于
$stdout.put(obj,…)

您的代码将
$stdout
替换为扩展类
IO
类型的对象。创建对象时,对象会打开文件
out.txt
进行写入,并与其从
IO
继承的内容完全兼容
$stdout
的默认行为


由于默认情况下,所有的输出都会转到
$stdout
,因此您对
$stdout
的新定义确保输出被写入文件
out.txt
,而不会对代码进行其他更改。

可能值得强调的是,其他帖子提到,这是一个全局变量,修改它不是线程安全的。例如,如果您将$stdout指向一个新的IO流,则应用程序(在该进程线程上)中所有将记录到stdout的内容现在都将记录到您的新IO流中。这可能会导致多个意外且可能敏感的输入流登录到新的IO流中。

可能值得强调的是,其他帖子提到,这是一个全局变量,修改它不是线程安全的。例如,如果您将$stdout指向一个新的IO流,则应用程序(在该进程线程上)中所有将记录到stdout的内容现在都将记录到您的新IO流中。这可能会导致多个意外且可能敏感的输入流出现在您的新IO流中。

非常好的解释,不仅是关于我问题的答案,而且还有关于如何更好地理解文档:))谢谢!!非常好的解释,不仅是关于我问题的答案,还有关于如何更好地理解文档:))谢谢!!哦,这个答案更深刻。谢谢哦,这个答案更深刻。谢谢