小编Jos*_*hua的帖子

为什么Scala需要递归函数的返回类型?

在下面的代码片段中,我有一个递归函数调用,用于在网络调用失败时促进重试(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)

scala

22
推荐指数
2
解决办法
1万
查看次数

当`git diff`显示更改但是`git merge`什么都不做时,合并分支的正确方法是什么

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.

git git-diff git-merge

10
推荐指数
1
解决办法
5006
查看次数

我可以在Scala中重载括号吗?

试图弄清楚如何在类上重载括号.

我有这个代码:

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

8
推荐指数
3
解决办法
1677
查看次数

Scala编译器在重用已知函数结果时的效率如何?

我正在研究基于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)

如果编译器确实可以优化第二种情况,那么函数的复杂性是否有限制?

我想做的是为了编程方便,避免多次运行某些数学重函数...

谢谢

scala

7
推荐指数
3
解决办法
407
查看次数

为什么在Rails 3中这个erb行为发生了变化?

我正在将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中有什么变化要求更新语法?

ruby-on-rails

6
推荐指数
2
解决办法
445
查看次数

在rails应用程序中对Javascript重UI进行集成测试的最佳方法是什么?

我们有一个Web应用程序,可以在UI中广泛使用AJAXy Javascript.我们使用Shoulda和Webrat对我们的后端进行了几乎完整的代码覆盖,并且希望扩展我们的测试套件以包括通过Javascript UI进行的完整集成测试.

我们尝试过Selenium,但发现它很脆弱和气质.有更可靠的选择吗?

UPDATE

对于那些仍在检查的人,我们最终使用Xvfb,因此我们可以在没有屏幕的情况下运行Firefox.允许我们在无头的Jenkins CI服务器上运行测试.我们仍然需要偶尔在本地运行测试以进行调试,但它运行良好.

javascript ruby-on-rails ruby-on-rails-3

6
推荐指数
1
解决办法
1674
查看次数

EventMachine和Ruby Threads - 这里到底发生了什么?

我们一起使用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

ruby ruby-on-rails eventmachine

6
推荐指数
1
解决办法
3506
查看次数

如何让我的rake任务让Jenkins知道构建失败了?

我们刚刚为我们的应用程序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)

ruby rake ruby-on-rails jenkins

4
推荐指数
1
解决办法
3687
查看次数