我正在探索随机生成的值,我想知道模式/名称是否已存在于概念中。我有一个功能(和特征),其签名如下
trait Generator[A] { // good name?
def generate: A
// alternatively () => A
}
它类似于随机数发生器的工作方式。
val rng = new util.Random
val randInt = rng.nextInt
我应该调用我的nextWidget
而不是生成吗?
答案 0 :(得分:4)
这完全取决于操作的语义。您可以将util.Random
视为随机值的来源,在该上下文中,nextInt
这样的名称是有意义的。如果方法是从文件或数据库中读取,我会发现像nextFoo
这样的名称有点误导,可能更喜欢loadFoo
之类的东西。在其他情况下,getFoo
或generateFoo
或initFoo
或createFoo
可能会更有意义。
三个快速注释:
如果您的方法有副作用(例如Random.nextInt()
),那么遵循约定并将其写为def generate(): Whatever
(注意括号)是很好的。无论如何,eta扩展函数都是() => Whatever
。
值得注意的是() => A
是Function0[A]
的语法糖,这些有时被称为“nullary函数”。
最后:我知道def generate[A]: A
可能仅仅是一个示例,但如果没有,您可能想要考虑约束类型A
的方法。 def generate[A]: A
说“告诉我任何类型,我会给你一个类型的值”,这是不可能以有用的方式实现的。
答案 1 :(得分:0)
有些人可能会称之为枚举器或迭代器:http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2014/Keynote-Duality
new Iterator[A]{
def hasNext: Boolean = true
def next(): A = ???
}
有些人可能称之为供应商:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Supplier.html
或者只是一个吸气剂:
trait Getter[A] {
def get(): A
}
其他建筑商,工厂,供应商或......发电机。语境在这里是王道。我将使用最能描述其预期实现的内容。