在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时促进重试(Amazon SimpleDB偶尔会返回503并需要重试.)
当我尝试编译时,Scala抱怨道recursive method simpledb_update needs result type.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) = {
try {
db(config("simpledb_db")) += (name, metadata)
} catch {
case e =>
// if it fails, try again up to 5 times
if(attempt < 6)
{
Thread.sleep(500)
simpledb_update(name, metadata, attempt + 1)
} else
AUlog(name + ": SimpleDB Failed")
}
}
Run Code Online (Sandbox Code Playgroud)
为什么递归函数需要这个?我的想法是只返回一个true/false布尔值来满足编译器...以下编译很好.
// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, …Run Code Online (Sandbox Code Playgroud) 当git diff other_branch表现出差异并且git merge other_branch什么都不做时,我感到难过.将"缺失"代码合并到什么位置的正确方法是my_branch什么?
这个SO答案描绘了一个类似于我的情况.
o---A---B---C-------G my_branch
\ \ /
--*D*---E---F other_branch
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,当我这样做时,D的变化不会自动合并my_branch
git checkout my_branch
git merge other_branch
Run Code Online (Sandbox Code Playgroud)
把在˚F到摹
当然我可以手动创建补丁并将其应用到my_branch,如下所示:
git diff other_branch my_branch > patchfile
git checkout my_branch
patch -p1 < patchfile
Run Code Online (Sandbox Code Playgroud)
但是我想要做到这一点,而不是弄乱git日志.使用补丁方法,git会将D和我最新补丁中的更改记录为彼此独立发生(代码流失).我想简化git log并确保其他人在他们这样做时不会发生意外的事情(悄悄地和阴险地)git merge my_branch.
试图弄清楚如何在类上重载括号.
我有这个代码:
class App(values: Map[String,String])
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我希望能够以这种方式访问值Map:
var a = new App(Map("1" -> "2"))
a("1") // same as a.values("1")
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我正在研究基于Scala的分析系统(http://www.hiringthing.com),我发现我经常问自己以下问题.给定一个没有副作用的"纯"函数,如果我用相同的输入击中该函数两次,我可以期望编译器重用第一次运行时生成的值,还是会再次遍历所有代码.换句话说,下面的第一个例子比第二个更有效吗?
def add(x: Int, y: Int) = x + y * 10000000000
val a = add(1,2)
do_something(a)
do_another_thing(a)
Run Code Online (Sandbox Code Playgroud)
与
def add(x: Int, y: Int) = x + y * 10000000000
do_something( add(1,2) )
do_another_thing( add(1,2) )
Run Code Online (Sandbox Code Playgroud)
如果编译器确实可以优化第二种情况,那么函数的复杂性是否有限制?
我想做的是为了编程方便,避免多次运行某些数学重函数...
谢谢
我正在将Rails 2.8应用程序移植到Rails 3.大多数东西现在正在工作,并且正在慢慢解决问题.我发现的一种行为令人困惑,我想了解幕后发生了什么变化.以下代码段在2.x中有效,但在3.0中失败:
<% if @apps.nil? || @apps.empty? %>
No rated applications.
<% else
ratingshidden = false
@apps.each { |app| %>
display app stuff etc....
Run Code Online (Sandbox Code Playgroud)
要使它在3中工作,我必须改变如下:
<% if @apps.nil? || @apps.empty? %>
No rated applications.
<% else %>
<%
ratingshidden = false
@apps.each { |app| %>
display app stuff etc....
Run Code Online (Sandbox Code Playgroud)
rails中有什么变化要求更新语法?
我们有一个Web应用程序,可以在UI中广泛使用AJAXy Javascript.我们使用Shoulda和Webrat对我们的后端进行了几乎完整的代码覆盖,并且希望扩展我们的测试套件以包括通过Javascript UI进行的完整集成测试.
我们尝试过Selenium,但发现它很脆弱和气质.有更可靠的选择吗?
UPDATE
对于那些仍在检查的人,我们最终使用Xvfb,因此我们可以在没有屏幕的情况下运行Firefox.允许我们在无头的Jenkins CI服务器上运行测试.我们仍然需要偶尔在本地运行测试以进行调试,但它运行良好.
我们一起使用Rails和EventMachine,当与Passenger一起使用时,有一些非常具体的设置需要完成.经过大量的试验和错误,我使EventMachine初始化运行良好,但我想更好地理解代码.正如您在下面的代码片段中所看到的,我们的初始化程序检查Passenger,然后在重新启动EventMachine之前检查它是否是分叉进程.
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
# for passenger, we need to avoid orphaned threads
if forked && EM.reactor_running?
EM.stop
end
Thread.new {
EM.run do
Run Code Online (Sandbox Code Playgroud)
我的问题与EM.reactor_running有关?和EM.stop命令.如果Passenger已分叉我们的进程,为什么我需要在新线程中重新启动EM引用?如果EM.reactor_running?返回true,我引用的EM实例是什么?
您可以在我们的博客上查看完整的初始化代码http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html
我们刚刚为我们的应用程序HiringThing设置了Jenkins CI服务器
一切都运行良好,当代码被检入我们的Github仓库时,构建会自动启动.
问题是检测构建失败.我从Jenkins命令行运行以下rake任务.
rake test:browser
Run Code Online (Sandbox Code Playgroud)
运行以下
desc "Run browser tests."
task :browser => :environment do
start = Time.now()
puts "Stopping apache if running"
system 'sudo apache2ctl stop'
puts "Running selenium tests"
Dir.glob('./test/browser/*.rb').each { |r|
puts r
system 'rvmsudo ruby ' + r
}
system 'echo -e "\a"'
puts "All browser tests, elapsed: " + (Time.now() - start).to_s + " seconds"
end
Run Code Online (Sandbox Code Playgroud)
我已经确认测试运行正常(使用带有Xvfb的无头Firefox)问题是Jenkins在浏览器测试中没有检测到任何构建失败.它似乎适用于通常的Rails单元,功能和集成测试(我在此任务之前在Jenkins中运行"rake test".)
据我所知,上面的这个脚本没有将ruby任务的失败退出代码传递给Jenkins,不明白为什么.现在,我能想到的唯一解决方法是将所有测试输出重定向到缓冲区,并使用grep查找失败关键字并传递失败的退出代码(如果找到),但这对我来说很麻烦.
我需要更改什么才能让Jenkins检测到"系统'rvmsudo ruby'+ r"命令何时返回失败的退出代码?
UPDATE
robertodecurnex是正确的,系统总是返回成功.但是,rake命令'sh'允许您捕获准确的代码.所以我改变了这个:
system 'rvmsudo ruby ' + r
Run Code Online (Sandbox Code Playgroud)
对此:
sh …Run Code Online (Sandbox Code Playgroud) scala ×3
ruby ×2
eventmachine ×1
git ×1
git-diff ×1
git-merge ×1
javascript ×1
jenkins ×1
rake ×1