我正在尝试在Scala中设计DSL.为此,我想在精确的字符串上创建一个隐式函数.我知道要为任何String创建一个隐式函数,我可以写:
class StringPlus(str: String) {
def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何修改它只为某些字符串创建这个隐式函数.是否可以为隐式函数赋予布尔条件,以便仅在布尔条件为真时才创建隐式函数(例如,如果字符串的长度为5或更大,如果字符串的第一个字母是字母"a"等)并不是所有的字符串?
我尝试构建一个简单的隐式类Int来为Ints添加一个函数:
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
}
}
Run Code Online (Sandbox Code Playgroud)
为了更自然地写,我希望DSL允许这个(带import Helper._):
2 add "3" and add "4"
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何做这个and功能.我认为这个会起作用:
object Helper {
implicit class IntHelper(i: Int) {
def add(str: String): Int = i + str.toInt
def and: Int = i
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果没有括号,它就无法工作(事实上,"2.add("3").and.add("4")但有效,但是对于DSL来说,有太多的句号和括号).
谢谢
我只是想知道,如果我使用一个属性和"pthread_attr_setdetachstate"带有参数的函数创建一个分离线程 (POSIX) PTHREAD_CREATE_DETACHED,我是否必须在程序结束时销毁该线程?
我知道我必须销毁为创建分离线程而创建的属性,但对于线程本身,我真的不知道。
这是我目前的代码.我想将一个字符串拆分为两个整数并将它们存储到变量中.
val line = "1 2"
var a = 0
var b = 0
val c = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) }
a = c._1
b = c._2
Run Code Online (Sandbox Code Playgroud)
有没有办法在Scala中做这样的事情?这更加紧凑.
(a,b) = line.split(" ") match { case Array(x,y) => (x.toInt, y.toInt) }
Run Code Online (Sandbox Code Playgroud)
表达式line.split("")匹配{case Array(x,y)=>(x.toInt,y.toInt)}返回一个整数的tupple所以我认为直接将两个整数与变量a和b联系起来工作.
我想生成一个两个Int元组的Vector.现在,我做如下:
(0 until 100).map(x => (x+1 until 100).map(y => (x,y))).flatten.filter { ... }
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更有效的方法来做到这一点.我觉得"扁平化"会减慢代码的速度.我必须使用"展平"还是可以使用其他东西?
PS1:如果我不使用"flatten",我有:Vector(Vector(a,b),Vector(c,d),...)而不是Vector((a,b),(c,d) ,...).
PS2:我在第二个生成器中使用(x + 1到100)因为我对元组(a,b)和(b,a)不感兴趣.