检测丢失的子!,排序!,地图!等

时间:2016-12-04 20:47:06

标签: ruby warnings lvalue targetnullvalue

从另一种语言的长期编码返回Ruby后,我经常假设foo.sortfoo.map {...}foo.sub /bar/, 'zip'更改 foo。当然我的意思是foo.sort!等等。但是在我注意之前通常需要3到4次调试。同时,计算排序,但不分配任何东西。我可以让ruby警告那个丢失的左值,就像C编译器警告一个函数被忽略的返回值一样吗?

2 个答案:

答案 0 :(得分:2)

你的意思是像Perl有点臭名昭着“在void上下文中使用map”?我不知道Ruby有这样的事情。听起来你需要更多的单元测试来捕获这样的错误,然后才能深入蠕虫到你的代码中被认为是错误。

请记住,Ruby比Perl这样的语言更灵活。例如,以下代码可能有用:

{{1}}

现在技术上说,在void上下文中是{{1}},但因为它被用作返回值,所以可能在别处被捕获。调用者有责任使用它。标记方法本身以获得某种警告是从大多数linting类型工具可以执行的操作中删除的级别。

答案 1 :(得分:1)

这是非常基本解析器:

  for k=3:5000

    q_=gWmacierz((1:N_/2+1),k-1);
    p_d1_=[p0_;gWmacierz((N_/2+2:N_+1),k-1)];
    p_d2_=[gWmacierz((N_/2+2:N_+1),k-1);pN_];
    F_=arrayfun(@funkcja,q_,p_d1_,p_d2_);

    C1_=diag(F_+4*Gc);
    C_=[C1_ C2_;C3_ C4_];
    tic;
    if k>3000
        Wwektor = ginvA_* ((gB_*gWmacierz(:,k-2)) + (C_*gWmacierz(:,k-1))  + (gD_*gu01_) + (gE_*gu00_) - gQ*gleak);
    else
        Wwektor = ginvA_* ((gB_*gWmacierz(:,k-2)) + (C_*gWmacierz(:,k-1))  + (gD_*gu01_) + (gE_*gu00_));
    end
    toc;
    gWmacierz(:,k)= Wwektor;

end

Pin=(gWmacierz(N_/2+2,:)+gWmacierz(N_/2+3,:))/2;
Pout=(gWmacierz(N_,:)+gWmacierz(N_+1,:))/2;

for k=3:5000    
    q=gmacierz((1:N/2+1),k-1);
    p_d1=[Pin(k);gmacierz((N/2+2:N+1),k-1)];
    p_d2=[gmacierz((N/2+2:N+1),k-1);Pout(k)];
    F=arrayfun(@funkcja,q,p_d1,p_d2);
    C1=diag(F+4*Gc);
    C=[C1 C2;C3 C4];
    wektor = ginvA* ((gB*gmacierz(:,k-2)) + (C*gmacierz(:,k-1))  + (gD*[Pin(k-1);Pout(k-1)]) + (gE*[Pin(k);Pout(k)]));

    gmacierz=[gmacierz wektor];

end  
    Qin=(gWmacierz(2,:));
    Qout=(gWmacierz(N/2,:));

    Qin_ref=(gmacierz(1,:));
    Qout_ref=(gmacierz(N/2+1,:));
    deltaQin=Qin-Qin_ref;
    deltaQout=Qout-Qout_ref;

它检查当前目录中的每个ruby脚本,其中@forgetful_methods = %w(sort map sub) Dir['*.rb'].each do |script| File.readlines(script).each.with_index(1) do |line, i| @forgetful_methods.each do |method| if line =~ /\.#{method}(?!!)/ && $` !~ /(=|\b(puts|print|return)\b|^#)/ puts format('%-25s (%3d) : %s', script, i, line.strip) end end end end # => # brace_globbing.rb ( 13) : subpatterns.map{|subpattern| explode_extglob(match.pre_match+subpattern+match.post_match)}.flatten # delegate.rb ( 11) : @targets.map { |t| t.send(m, *args) } sortmap没有sub,前面没有!,{{ 1}},=puts

这只是一个开始,但也许它可以帮助你找到一些低悬的果实。 但是,有许多误报。

更复杂的版本可以使用抽象语法树,例如使用Ripper