Ruby 挑战 - 方法链接和惰性求值

2024-01-02

读完文章后http://jeffkreeftmeijer.com/2011/method-chaining-and-lazy-evaluation-in-ruby/ http://jeffkreeftmeijer.com/2011/method-chaining-and-lazy-evaluation-in-ruby/,我开始寻找更好的方法链接和惰性求值解决方案。

我想我已经用下面的五个规格概括了核心问题;有谁能让他们全部通过吗?

任何事情都可以:子类化、委托、元编程,但不鼓励后者。

将依赖关系保持在最低限度是有利的:

require 'rspec'

class Foo
    # Epic code here
end

describe Foo do

  it 'should return an array corresponding to the reverse of the method chain' do
    # Why the reverse? So that we're forced to evaluate something
    Foo.bar.baz.should == ['baz', 'bar']
    Foo.baz.bar.should == ['bar', 'baz']
  end

  it 'should be able to chain a new method after initial evaluation' do
    foobar = Foo.bar
    foobar.baz.should == ['baz', 'bar']

    foobaz = Foo.baz
    foobaz.bar.should == ['bar', 'baz']
  end

  it 'should not mutate instance data on method calls' do
    foobar = Foo.bar
    foobar.baz
    foobar.baz.should == ['baz', 'bar']
  end

  it 'should behave as an array as much as possible' do
    Foo.bar.baz.map(&:upcase).should == ['BAZ', 'BAR']

    Foo.baz.bar.join.should == 'barbaz'

    Foo.bar.baz.inject do |acc, str|
      acc << acc << str
    end.should == 'bazbazbar'

    # === There will be cake! ===
    # Foo.ancestors.should include Array
    # Foo.new.should == []
    # Foo.new.methods.should_not include 'method_missing'
  end

  it "should be a general solution to the problem I'm hoping to solve" do
    Foo.bar.baz.quux.rab.zab.xuuq.should == ['xuuq', 'zab', 'rab', 'quux', 'baz', 'bar']
    Foo.xuuq.zab.rab.quux.baz.bar.should == ['bar', 'baz', 'quux', 'rab', 'zab', 'xuuq']
    foobarbaz = Foo.bar.baz
    foobarbazquux = foobarbaz.quux
    foobarbazquuxxuuq = foobarbazquux.xuuq
    foobarbazquuxzab = foobarbazquux.zab

    foobarbaz.should == ['baz', 'bar']
    foobarbazquux.should == ['quux', 'baz', 'bar']
    foobarbazquuxxuuq.should == ['xuuq', 'quux', 'baz', 'bar']
    foobarbazquuxzab.should == ['zab', 'quux', 'baz', 'bar']
  end

end

这受到 Amadan 答案的启发,但使用了更少的代码行:

class Foo < Array
    def self.method_missing(message, *args)
        new 1, message.to_s
    end
    def method_missing(message, *args)
        dup.unshift message.to_s
    end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 挑战 - 方法链接和惰性求值 的相关文章

  • ActiveSupport::JSON 解码哈希丢失符号

    我正在尝试序列化和反序列化哈希 当散列被解除序列化时 密钥被解除符号化 例如不是更多 一 而是 一 从 Rails 控制台 gt gt h one gt 1 two gt two one gt 1 two gt two gt gt j Ac
  • 在 ruby​​ 中卸载动态声明的类

    我有一个使用 theClass class eval 和 Object const set className theClass 定义的类 有什么办法可以删除这个类的定义吗 在测试过程中 我需要加载同一类的不同版本 Object send
  • 为什么 Ruby 没有内置线程池?

    我有一个程序 它一次创建 10000 个线程 并同时运行 8 个线程 但是Ruby没有像Java那样内置ThreadPool 有充分的理由吗 可能是因为使用标准库 Queue 类很容易推出您自己的 q Queue new 3 times T
  • 拆分字符串而不删除分隔符

    我需要解析一个文件以获取单个 SQL 语句并从 Rails 控制器运行它们 我有以下代码 sql file RAILS ROOT lib evidence interface import sql sql stmts array File
  • 为什么将 Backbone.js 与 Rails 结合使用? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 rspec 中打印响应

    我有一个测试无法开始工作 所以我想通过打印响应来调试我的规范 我尝试过使用print response body在我的规范中 但 test log 或控制台中都没有输出 我可能错过了一些东西 我应该尝试什么 Thanks 您可以使用以下方式
  • 如何在 test/fixtures/user.yml 中创建可用于 Devise 4 中集成测试的测试用户?

    从下面的代码中可以看到 我已经创建了一个用户users yml 包括设备的集成测试助手test helper rb 这就是为什么我能够使用sign in方法 基于设计的自述文件 https github com plataformatec
  • Haskell 中动态规划的高效表

    我已经编码了0 1背包问题 http en wikipedia org wiki Knapsack problem 0 1 knapsack problem在哈斯克尔 我对迄今为止所取得的懒惰和普遍性水平感到相当自豪 我首先提供用于创建和处
  • 正则表达式匹配组,但组成员除外

    因此 有许多正则表达式可以匹配特定的组 如下所示 Any character except a newline m Any character the m modifier enables multiline mode w A word c
  • 学习树顶

    我正在尝试自学 Ruby 的 Treetop 语法生成器 我发现 对于 最好的 文档来说 不仅文档非常稀疏 而且它的工作方式似乎并不像我希望的那样直观 从高层次上来说 我真的很喜欢比现场文档或视频更好的教程 如果有的话 在较低的层面上 这是
  • 不使用 RVM 时的 Cron +

    我使用的是RVM环境 RUby 版本 2 1 2 导轨 4 1 1 schedule rb every 1 minute do runner note send mail end I used whenever update crontab
  • 如何停止 Heroku 服务器?

    我有一个托管在 heroku 上的临时服务器 我只想将其关闭 但不想破坏该应用程序 我该怎么做 我是否有类似 heroku stop 之类的命令 例如 heroku restart 来重新启动 OR 有没有办法让服务器在超过 750 小时免
  • 关于空 own_to 关联的最佳实践

    想象一下以下情况 我有一个dog模型和一个house模型 一只狗可以属于一个房子 一个房子可以有很多只狗 所以 Class Dog lt ActiveRecord Base belongs to house end Class House
  • Ruby:邮件 gem 在邮件中的 60 个字符后添加 \r\n

    我要移植Actionmailer x509 https github com petRUShka actionmailer x509到 Rails 3 为了做到这一点 我尝试从带有签名电子邮件的大字符串创建 Mail 对象 您可以在这一行看
  • Ruby Time.parse 给我超出范围的错误

    我正在使用 Time parse 从字符串创建 Time 对象 因为某些原因 Time parse 05 14 2009 19 00 导致参数超出范围错误 而 Time parse 05 07 2009 19 00 does not 有任何
  • 如何在 Ruby on Rails 中访问控制器中的隐藏字段

    问题 如何访问隐藏字段值post id从文件view comments comment html erb并用在controllers dashboards controller rb 有 2 个控制器 仪表板和评论 并使用gem act a
  • RVM 无法通过 SSH 工作(作为一项功能)

    我刚刚在 Debian 6 服务器上安装了 RVM 一开始没有任何问题 但是 在一切设置完成后 我无法在终端中运行 RVM 我打字时收到的消息rvm use is RVM is not a function selecting rubies
  • 为什么 Ruby 中两个用空格分隔的字符串连接在一起?

    为什么这在 Ruby 中有效 foo bar gt foobar 我不确定为什么要连接字符串而不是给出语法错误 我很好奇这是否是预期的行为 以及解析器是否负责争论 没有运算符的两个字符串被视为单个字符串 或者语言定义本身指定了这种行为 隐式
  • Rails 中带有 text_field 的逗号分隔数组

    我有一些users可以有很多posts 并且每个帖子都可以有很多tags 我已经使用一个实现了拥有并属于许多帖子和标签之间的关系 创建新帖子时 用户可以使用逗号分隔的值列表对其进行标记 就像在 SO 上发布新问题时一样 如果任何标签尚不存在
  • Delayed_job不会运行用户定义的方法

    我一直在尝试让 DelayedJob 在后台运行一些用户定义的方法 对于这个测试用例 我在助手中定义了以下方法 def test case u User new u first name JimBob u last name joe u e

随机推荐