加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 19:07:18 所属栏目:百科 来源:网络整理
导读: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_v
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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读