考虑以下Scala案例类:
case class WideLoad(a: String, b: Int, c: Float, d: ActorRef, e: Date)
Run Code Online (Sandbox Code Playgroud)
模式匹配允许我提取一个字段并丢弃其他字段,如下所示:
someVal match {
case WideLoad(_, _, _, d, _) => d ! SomeMessage(...)
}
Run Code Online (Sandbox Code Playgroud)
我想做什么,以及当一个案例类有大约20个奇数字段时更有意义的是,以一种不涉及输入的方式提取几个值WideLoad(_, _, _, _, _, some, _, _, _, thing, _, _, interesting).
我希望命名args可以在这里提供帮助,尽管以下语法不起作用:
someVal match {
case WideLoad(d = dActor) => dActor ! SomeMessage(...)
// ^---------- does not compile
}
Run Code Online (Sandbox Code Playgroud)
这里有什么希望,还是我不知道输入很多很多_, _, _, _?
编辑:我明白我能做到case wl @ WideLoad(...whatever...) => wl.d,但我仍然想知道是否有更复杂的语法能够满足我的需求,而无需引入额外的内容val.
Haskell中的模式匹配是什么?它与保护方程有什么关系?
我试过寻找一个简单的解释,但我还没找到.
编辑:有人标记为家庭作业.我不再去上学了,我只是在学习Haskell,而我正在努力理解这个概念.纯粹出于兴趣.
如果我说let 5 = 10,为什么5 + 1返回6而不是11?
haskell pattern-matching variable-assignment let assignment-operator
我想在Python中的列表上进行一些模式匹配.例如,在Haskell中,我可以执行以下操作:
fun (head : rest) = ...
Run Code Online (Sandbox Code Playgroud)
因此,当我传入一个列表时,head将是第一个元素,rest并将成为尾随元素.
同样,在Python中,我可以自动解压缩元组:
(var1, var2) = func_that_returns_a_tuple()
Run Code Online (Sandbox Code Playgroud)
我想用Python中的列表做类似的事情.现在,我有一个返回列表的函数,以及执行以下操作的一大块代码:
ls = my_func()
(head, rest) = (ls[0], ls[1:])
Run Code Online (Sandbox Code Playgroud)
我想知道我是否能以某种方式在Python中用一行来代替,而不是两行.
在Ruby中我可以这样写:
case n
when 0...5 then "less than five"
when 5...10 then "less than ten"
else "a lot"
end
Run Code Online (Sandbox Code Playgroud)
我如何在Scala中执行此操作?
编辑:我最好比使用它更优雅if.
我有个问题.我的公司给了我一项非常无聊的任务.我们有两个对话框数据库.其中一个数据库包含可怕质量的图像,另一个非常高质量.
不幸的是,可怕质量的对话包含了对其他信息的重要映射.
我的任务是,手动,浏览所有不良图像并将它们匹配到好的图像.
是否有可能在任何程度上自动化这个过程?以下是两个对话框(从Google图像中随机抽取)的示例:


所以我目前正在尝试用C#编写一个程序来从数据库中提取这些照片,循环浏览它们,找到具有常见形状的照片,并返回它们的ID.我最好的选择是什么?
如何使用通配符识别字符串?
我发现了glob2rx,但我不太明白如何使用它.我尝试使用以下代码来选择以单词开头的数据框行blue:
# make data frame
a <- data.frame( x = c('red','blue1','blue2', 'red2'))
# 1
result <- subset(a, x == glob2rx("blue*") )
# 2
test = ls(pattern = glob2rx("blue*"))
result2 <- subset(a, x == test )
# 3
result3 <- subset(a, x == pattern("blue*") )
Run Code Online (Sandbox Code Playgroud)
但是,这些都没有奏效.我不确定我是否应该使用不同的功能来尝试这样做.
为什么Scala有unapply和unapplySeq?两者有什么区别?我什么时候应该更喜欢一个?
我发现自己编写如下代码:
val b = a map (entry =>
entry match {
case ((x,y), u) => ((y,x), u)
}
)
Run Code Online (Sandbox Code Playgroud)
我想以不同的方式写它,如果只有这个工作:
val c = a map (((x,y) -> u) =>
(y,x) -> u
)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让我接近这个吗?
我有以下内容:
serv match {
case "chat" => Chat_Server ! Relay_Message(serv)
case _ => null
}
Run Code Online (Sandbox Code Playgroud)
问题是有时我还会在serv字符串的末尾传递一个额外的参数,所以:
var serv = "chat.message"
Run Code Online (Sandbox Code Playgroud)
有没有办法可以匹配字符串的一部分,所以它仍然被发送到Chat_Server?
谢谢你的帮助,非常感谢:)