从另一种语言的长期编码返回Ruby后,我经常假设foo.sort
,foo.map {...}
,foo.sub /bar/, 'zip'
将更改 foo。当然我的意思是foo.sort!
等等。但是在我注意之前通常需要3到4次调试。同时,计算排序,但不分配任何东西。我可以让ruby警告那个丢失的左值,就像C编译器警告一个函数被忽略的返回值一样吗?
答案 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) }
,sort
或map
没有sub
,前面没有!
,{{ 1}},=
或puts
。
这只是一个开始,但也许它可以帮助你找到一些低悬的果实。 但是,有许多误报。
更复杂的版本可以使用抽象语法树,例如使用Ripper。