做图形设计时,常常需要处理大量形状、颜色和变换操作。最近在用 Scala 写一个自动生成海报的工具,发现 apply 方法用起来特别顺手。
什么是 apply 方法
Scala 里的 apply 是个特殊方法,它让你不用写 .method 就能直接调用对象。比如你有一个类负责生成渐变色:
class Gradient(val start: String, val end: String)
object Gradient {
def apply(start: String, end: String): Gradient =
new Gradient(start, end)
}
这时候你可以直接写 Gradient("#ff0000", "#0000ff"),就像调用函数一样,实际上是在创建实例。这种写法在构建 UI 组件时很常见,比如定义按钮样式或图层布局。
简化图形工厂
我在做一个模板系统,需要频繁生成圆角矩形、图标容器这些元素。用了 apply 后,代码变得干净多了:
object RoundedBox {
def apply(width: Int, height: Int, radius: Int = 8) =
s<rect width="$width" height="$height" rx="$radius" />
}
调用的时候直接 RoundedBox(200, 100) 就行,读起来像在说“画个圆角框”,跟设计师口吻都对上了。
配合 case class 更省事
很多图形数据结构我用 case class 定义,它们自带 apply。比如表示一个文字图层:
case class TextLayer(content: String, fontSize: Int, color: String)
// 创建实例
val title = TextLayer("欢迎光临", 24, "#333")
这里的 TextLayer(...) 其实就是调用了伴生对象的 apply,不用显式写 new 或者 .create 这类多余字眼。
项目里到处都是这种轻量调用,写脚本生成 SVG 的时候,逻辑清晰又不容易出错。尤其是跟非程序员同事协作时,他们看代码也更容易理解。”