【问题标题】:Is it possible for an undeclared enumerable object to be able to call itself within a block?未声明的可枚举对象是否可以在块内调用自身?
【发布时间】:2016-02-09 23:57:24
【问题描述】:

我最近问了一个问题 (Equality test on three or more objects),我试图确定一种优雅的方式来对一组 3 个或更多对象运行相等测试。一个解决方案原来是这样的:

array = [1,1,1,1]
array.all? {|x| x == array.first }

我想知道是否可以将其减少到仅一行,以便我可以做一些会被解释为这样的事情

[1,1,1,1].all? {|x| x == [1,1,1,1].first }
#=> true

我能够以某种方式引用块调用的初始对象,而无需首先在前一行中声明该对象。在伪代码中,我想做的是这样的:

[1,1,1,1].all? {|x| x == object_being_called_on_by_block.first }
#=> true

我也试过这个,但没用:

[1,1,1,1].all? { |x| x == self.first }

【问题讨论】:

    标签: ruby block self


    【解决方案1】:

    这在 SO 上经常被问到,并且经常被要求作为 Ruby 核心的一个特性。到目前为止,一位 Ruby 核心开发人员建议这样做:

    [1,1,1,1].tap{|a| break a.all?{|x| x == a.first}}
    

    如果你不介意性能,你可以这样做:

    [1,1,1,1].instance_eval{all?{|x| x == first}}
    

    【讨论】:

    • 我在这里见过一次:stackoverflow.com/questions/19834086/…,但无法从示例中得到太多。该解决方案也显得不同且更简单。谢谢
    • 啊。所以在你的第二个例子中,你实际上可以使用 self 关键字,但这将是多余的。明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多