在 ruby 中,自定义方法不适用于 File 内置类

问题描述 投票:0回答:1

我想在对象类和数组类上创建自定义方法。 它与整数、字符串等数组完美配合,但不适用于文件。 奇怪!

class Object
    def foo
        puts("Object#foo on #{self.inspect}")
    end
end

class Array
    def foo
        puts("Array#foo on #{self.inspect}")
        self.each do |e| 
            e.foo
        end
    end
end

那么,

a = [1,2]
a.foo

显示:

[1, 2] 上的数组#foo
对象#foo on 1
对象#foo on 2

但是,

b = [File.new('f1','w'),File.new('f2','w')]
b.foo

仅显示:

[#, #] 上的数组#foo

ruby class extend built-in
1个回答
0
投票

您的问题不是

Object#foo
,而是实际上您假设
puts
Kernel#puts
,但在
File
的背景下,它实际上是
IO#puts

puts(obj, ...) → nil

将给定对象写入ios。在任何尚未以换行符序列结尾的行之后写入换行符。返回

nil

必须打开流才能写入。如果使用数组参数调用,则将每个元素写入新行。每个不是字符串或数组的给定对象都将通过调用其

to_s
方法进行转换。如果不带参数调用,则输出一个换行符。

因此,它不是像您期望的那样输出到

STDOUT
,而是将 put 语句写入文件。

要解决这个问题,您可以直接拨打

Kernel#puts

class Object
    def foo
        Kernel.puts("Object#foo on #{self.inspect}")
    end
end

然后

b = [File.new('f1','w'),File.new('f2','w')]
b.foo
# Array#foo on [#<File:f1>, #<File:f2>]
# Object#foo on #<File:f1>
# Object#foo on #<File:f2>
# => [#<File:f1>, #<File:f2>]
© www.soinside.com 2019 - 2024. All rights reserved.