gpt4 book ai didi

ruby-on-rails - Scala 中是否有 Rails "returning"方法的模拟?

转载 作者:行者123 更新时间:2023-12-04 16:30:14 25 4
gpt4 key购买 nike

在 Rails 中,可以使用:

returning Person.create do |p|
p.first_name = "Collin"
p.last_name = "VanDyck"
end

避免必须这样做:
person = Person.create
person.first_name = "Collin"
person.last_name = "VanDyck"
person

我认为前一种方式更干净,重复性更少。我发现自己在我的 Scala 项目中创建了这个方法:
def returning[T](value: T)(fn: (T) => Unit) : T = {
fn(value)
value
}

我知道由于对象倾向于不可变,它的实用性有些有限,但例如使用 Lift,在 Mapper 类上使用此方法效果很好。

是否有我不知道的用于“返回”的 Scala 模拟?或者,在 Scala 中是否有类似的更惯用的方法来做到这一点?

最佳答案

您的方法看起来不错,尽管我通常通过添加副作用的方法来做到这一点,其中可以包括更改内部状态(或类似 println 之类的东西):

class SideEffector[A](a: A) {
def effect(f: (A => Any)*) = { f.foreach(_(a)); a }
}
implicit def can_have_side_effects[A](a: A) = new SideEffector(a)

scala> Array(1,2,3).effect(_(2) = 5 , _(0) = -1)
res0: Array[Int] = Array(-1, 2, 5)

编辑:以防万一不清楚这在原始示例中有何用处:
Person.create.effect(
_.first_name = "Collin",
_.last_name = "VanDyck"
)

编辑:将方法的名称更改为“效果”。我不知道为什么我之前没有那样做——副作用,而不是命名的副作用。

关于ruby-on-rails - Scala 中是否有 Rails "returning"方法的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com