ruby – 如果这段代码不是一个笑话,它究竟是如何工作的?

前端之家收集整理的这篇文章主要介绍了ruby – 如果这段代码不是一个笑话,它究竟是如何工作的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
class Tree
  def initialize*d;@d,=d;end
  def to_s;@l||@r?",>":@d;end
  def total;(@d.is_a?(Numeric)?@d:0)+(@l?@l.total: 0)+(@r?@r.total: 0);end
  def insert d
    alias g instance_variable_get
    p=lambda{|s,o|d.to_s.send(o,@d.to_s)&&
      (g(s).nil??instance_variable_set(s,Tree.new(d)):g(s).insert(d))}
    @d?p[:@l,:]:@d=d
  end
end

有人愿意尝试解释这是做什么的吗?在我问到的代码too clever的问题中,它似乎是一个答案.但是,对我来说,判断它是否只是一个笑话太聪明了.如果不是,我有兴趣知道它是如何工作的,如果有人愿意解释的话.

解决方法

编辑:发布原始混淆示例的人在答案中给出了 the actual source code.他还发布了一个 corrected version of the obfuscated code,因为正如我所说,即使你删除了时髦的语法,其中一些也没有意义.

这是一些很好的混淆代码.与大多数混淆代码一样,它主要是许多三元运算符,并且顽固地拒绝将正常人放入空格.这里写的基本上是相同的东西:

class Tree
  def initialize(*d)
    @d,= d # the comma is for multiple return values,# but since there's nothing after it,# all but the first are discarded.
  end
  def to_s
    @l || @r ? ",>" : @d
  end
  def total
    total = @d.is_a?(Numeric) ? @d : 0
    total += @l.total if @l
    total += @r.total if @r
  end
  def insert(arg)
    if @d
      if @l
        @l.insert(arg)
      else
        @l = Tree.new(arg)
      end
    else
      @d = arg
    end
  end
end

insert方法在语法上没有效果(它在一个部分缺少一个方法名称),但就我所知,这基本上就是它所做的.该方法的混淆非常厚:

>而不是仅仅执行@l = whatever,它使用instance_variable_get()和instance_variable_set().更糟糕的是,它将instance_variable_get()别名为g().>它将大多数功能包含在lambda函数中,并将其传递给@l的名称.然后它用func [arg1,arg2]的鲜为人知的语法调用这个函数,它相当于func.call(arg1,arg2).

原文链接:https://www.f2er.com/ruby/270049.html

猜你在找的Ruby相关文章