Ruby 如何获取当前IO上下文

Ruby 如何获取当前IO上下文,ruby,io,Ruby,Io,当字符串流式传输到终端时,我想pimp某些字符串方法。例如,我想将String#重写为_s。我希望字符串在终端上带有ANSI颜色代码,而不是在写入文件时。为此,我必须访问当前正在写入的IO。我是否有权访问标识当前读/写上下文的变量?IO#isatty可能就是您要查找的。但塞尔吉奥的建议仍然是更好的选择 。与其修改String方法,不如修改IO方法,如put、print等。您可以为IO的每个子类赋予不同的定义,例如File(多态性)。然后,不需要识别IO类。这听起来不对。我更喜欢使用打印机(Ter

当字符串流式传输到终端时,我想pimp某些字符串方法。例如,我想将
String#重写为_s
。我希望字符串在终端上带有ANSI颜色代码,而不是在写入文件时。为此,我必须访问当前正在写入的IO。我是否有权访问标识当前读/写上下文的变量?

IO#isatty
可能就是您要查找的。但塞尔吉奥的建议仍然是更好的选择


。与其修改
String
方法,不如修改
IO
方法,如
put
print
等。您可以为
IO
的每个子类赋予不同的定义,例如
File
(多态性)。然后,不需要识别IO类。

这听起来不对。我更喜欢使用打印机(
TerminalPrinter
RawPrinter
HttpPrinter
,等等)。这不是一个错误的问题,而是一个可能性的问题。我是否有权访问IO流?但是我必须在实现puts的所有类中多次修改相同的函数,对吗?当前的实现是覆盖Kernel#put,并在参数为字符串的情况下进行PIMP。我更喜欢pimp字符串类,因为这正是我想要的。我不是建议覆盖
Kernel\puts
,而是建议覆盖
IO\puts
的子类。。。那么,哪个子类负责写入终端$stdout似乎是一个纯IO对象,中间没有子类。在它上面定义一个单例方法。这个解决方案对于我们的特定问题来说已经足够好了。我原以为我要覆盖一个已经存在的#put,但事实证明File类和Socket类都没有自己的实现,它们都使用超类(IO)实现。IO#isatty指的是在IO对象上识别它是否在终端中。它不会告诉我字符串中的内容,而该字符串正被写入到io对象中。这就是我想要的,然后我可以用#isatty或#tty?