How do I inherit from Pathname in Ruby?
-
21-01-2021 - |
题
I have a RemoteFile
that inherits from Pathname
class RemoteFile < Pathname
end
I create a remote file, and get its parent
irb> RemoteFile.new('.')
=> #<RemoteFile:.>
irb> RemoteFile.new('.').parent
=> #<Pathname:..>
Is there any way to get Pathname to return RemoteFiles besides monkey-patching a dozen methods in Pathname? Wouldn't it work better if Pathname returned objects of type self.class.new
?
解决方案
You could consider delegating to an actual Pathname
object. Have a look at this article. This way you wouldn't have to monkey patch anything, and because of delegation, you could modify things in a safer, more controllable way.
其他提示
This worked for me so far:
class Winpath < Pathname
def to_s
super.tr("/", "\\")
end
def +(other)
self.class.new super(other)
end
end
Seems like +(other) is the only function you need to overload.
In fact you can just reopen the Pathname class instead of inheriting it.
不隶属于 StackOverflow