【问题标题】:Looking for way to easily implement a File/IO-like class in Ruby寻找在 Ruby 中轻松实现类文件/IO 类的方法
【发布时间】:2012-03-05 05:34:04
【问题描述】:

我想在 Ruby (1.9) 中实现一个类似文件的类,但不想重新实现或装饰 StringIO 和 IO 类提供的每一个方法。我可以包含一个模块来帮助我吗?我想免费提供read() 方法并获得readLines() 方法(然后使用read())。

这类似于 Comparable 模块添加运算符 <、<=、==、>= 和 > 的方式,只要已实现 <=>。我在寻找类似的文件。

如果我没记错的话,Java 和/或 Apache Commons 的工作原理是这样的:基本上只有一两种方法,而其他所有方法都使用它们进行读/写。

我正在为可写的 File 和 StringIO 对象实现一个包装器,它在每次写入时透明地更新一个 SHA256 摘要。

【问题讨论】:

    标签: ruby file io


    【解决方案1】:

    正如您已经说过您正在实现“包装类”,我建议使用Decorator Pattern。

    Ruby 允许您使用多种方法来实现它,它很简单,并且完全可以满足您的需求:例如,如果使用method_missing 实现模式,您只需实现摘要计算所需的写入方法。在实现中,将写入委托给装饰对象,并使用写入的字符串更新您的 SHA256 Digest 实例。

    【讨论】:

    • 我知道这种模式,我想避免装饰~10 种方法。此外,显然我不能“在返回值上执行我的 SHA256”,例如IO#write 方法将愉快地返回“写入的字节数”,而不是原始字符串。因此,对于您答案的那部分,现在为-1,也许您可​​以改进它或删除不正确的部分。
    • 这就是 Ruby 中装饰器模式的重点——你不必装饰所有方法,如果你使用例如带有“method_missing”的实现。只需实施您需要更新摘要的那些。我的意思是从 IO 读取时返回值,因为您一开始就在谈论读取。我会更正那部分。
    • 撤消-1。我仍然对此不太满意,因为在我看来,我可以装饰<<、putc、puts、syswrite 和write,其中一些在参数期望上有所不同.我不能只是假设它是我得到的字符串并使用def method_missing m,*a ; @sha << a[0] ; @dec.send m, *a ; end 完成。或者我可以吗?
    • 特别棘手:printf。至少需要它自己的代理/装饰器方法。
    • 想象一下 Ruby 1.9.7 将为所有类似文件的类添加大量的编写方法。我不想在这里继续寻找未来的 API 添加。并不是说这很可能,但仍然如此。
    【解决方案2】:

    如果您不想从 IO 继承,那么您可能会想要使用 Kernel 中的方法,尤其是 open、gets 及其实现的 readline 或 readlines。

    尽管如此,您正在丢弃大量已调试的预先编写的代码。就个人而言,我会将 IO 子类化并将“读取”和“写入”类型的例程别名为某个安全名称,然后创建通过调用原始版本来执行写入的新版本,然后更新 SHA256。

    【讨论】:

    • 从 IO 和 StringIO 继承对我来说很好,只要我知道我必须覆盖哪些方法以使结果不可搜索并且每个字符串 write 接收通过 SHA256#update 方法.我只是不想自己装饰每一个方法。
    • 使用内核方法不是一种选择,因为它们将根据(缺少)参数使用全局变量。
    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2017-07-20
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多