是否有办法在没有名称空间污染的情况下创建方法级别常量?

yur*_*ura 5 coding-style scala

例如,我想通过一些字段值过滤对象.我可以写

objects.filter{ o =>
   val set = Set(c1,c2)
   set contains o.field
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我会在每次调用方法时创建hashset ==>它会很慢

我也可以这样写

val set = Set(c1,c2)
objects.filter{ o =>
   set contains o.field
}
Run Code Online (Sandbox Code Playgroud)

它会很快工作,但我用无意义的物体污染了我的空间set.

做这个的最好方式是什么?

Rog*_*ach 12

这似乎有效:

objects.filter {
  val set = Set(c1,c2)
  o => set contains o.field
}
Run Code Online (Sandbox Code Playgroud)

如果你将"Set(c1,c2)"分解为这样的def:

def getSet = { println("Set!"); Set(5,7)}
Run Code Online (Sandbox Code Playgroud)

您会看到只创建了一个集合.


Lui*_*hys 7

只需在其周围放置大括号,名称空间就不再受到污染.

{
  val set = Set(c1,c2)
  objects.filter{ o =>
    set contains o.field
  }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*rov 7

使用内部命名函数,它们有助于更好地构造代码并保持命名空间清洁.

def someMeaningfulName = {
  val set = Set(c1,c2)
  objects.filter{ o =>
    set contains o.field
  }
}
Run Code Online (Sandbox Code Playgroud)