Ruby on rails ActiveSupport的Object.try在Ruby中的Scala等价物

Ruby on rails ActiveSupport的Object.try在Ruby中的Scala等价物,ruby-on-rails,ruby,scala,apache-spark,chaining,Ruby On Rails,Ruby,Scala,Apache Spark,Chaining,是核心Ruby的常见扩展。例如,默认情况下,它在Rails中可用。只有当对象不是nil Ruby的null时,try才会在对象上执行方法或代码块。它的用法有三种: 对非nil对象调用方法并返回结果: 客户或无。请尝试:保存 如果到目前为止结果不是零,则在表达式中链接任意代码块: 试着{做点什么事{u nil_obj} 扩展名2不用于可选处理,而是用于继续链式表达式,其中步骤n+1中的方法需要一个必须基于步骤n的结果计算的参数: data.analyze.try{| result | result

是核心Ruby的常见扩展。例如,默认情况下,它在Rails中可用。只有当对象不是nil Ruby的null时,try才会在对象上执行方法或代码块。它的用法有三种:

对非nil对象调用方法并返回结果: 客户或无。请尝试:保存

如果到目前为止结果不是零,则在表达式中链接任意代码块: 试着{做点什么事{u nil_obj}

扩展名2不用于可选处理,而是用于继续链式表达式,其中步骤n+1中的方法需要一个必须基于步骤n的结果计算的参数: data.analyze.try{| result | result.compressoptimal_settingsresult}.save

我特别感兴趣的是Scala等价物3或另一种Scala习惯用法,例如,它允许以下与Apache Spark相关的代码:

val df=ctx.sqlselect*从my_表 df。 repartitionmax1,df.rdd.partitions.size/4。 saveAsTableRepartited_表 使用Ruby语法将其重构为如下内容

ctx。 从my_表中选择sqlselect*。 请尝试{| df | df.repartitionmax1,df.rdd.partitions.size/4}。 saveAsTableRepartited_表 重构的目标是通过维护单个方法链来提高可读性,并通过将df严格限定在链中绝对需要的步骤来减少范围污染


注意:我对使用选项进行可选处理的利弊讨论不感兴趣,因为这不是这个问题所涉及的try的主要用例。

不在标准库中,但相当于3的是易于编写的try是一个关键字,因此重命名为ap,简称apply:


一个需要理解的人应该做这项工作。Try-in-Scala是一个monad,这意味着flatmap是在它上面定义的。flatmap在尝试中的工作方式是将其参数应用于成功路径。对于{df@BobDalgleish您错过了问题的目的:我正在寻找一个支持方法链接的答案。请查看Alexey的答案。对我不起作用:null.apidentity//:12:错误:值ap不是Null@JörgWMittag我可以重现上面的错误,但是,当我使用来自Spa的空值的ap时rk SQL使用任意值变量我没有得到任何错误。Alexey,有没有办法解决问题@JörgWMittag identified?如果你给null一个类型,例如null:String.ap…或val x:String=null;x.ap…,它会工作。但是null本身有一个特殊的null类型,并且似乎不能对它进行任何隐式转换。这看起来像是一个编译器bug对我来说,我已经问过了
implicit class TryOp[A](x: A) {
  def ap[B](f: A => B): B = f(x)
}

ctx.
  sql("select * from my_table").
  ap { df => df.repartition(max(1, df.rdd.partitions.size / 4)) }.
  saveAsTable("repartitioned_table")