想象一下我Map[String, String]在Scala中有一个.
我想匹配地图中的全套键值对.
这样的事情应该是可能的
val record = Map("amenity" -> "restaurant", "cuisine" -> "chinese", "name" -> "Golden Palace")
record match {
case Map("amenity" -> "restaurant", "cuisine" -> "chinese") => "a Chinese restaurant"
case Map("amenity" -> "restaurant", "cuisine" -> "italian") => "an Italian restaurant"
case Map("amenity" -> "restaurant") => "some other restaurant"
case _ => "something else entirely"
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨说:
error: value Map is not a case class constructor, nor does it have an unapply/unapplySeq method
目前什么是模式匹配键值组合的最佳方法Map?
我被要求参加一个研讨会并尽快编写dojo,以便人们尝试使用Scala并尝试用它来构建一些东西.与会者都将成为Scala的新手,可能来自多种语言中的任何一种(我认为他们可以使用至少一种主流语言编写代码 - 我包括与Java,C#,Python和Ruby的语法比较).
Scala的一部分吸引力在于它是实用的 - 您可以将它用作插入式"强大的Java"(Java具有更少的语法杂乱,闭包,不变性,FP,特征,单例对象,漂亮的XML处理,类型推断等. )仍然在JVM(以及据称的.NET CLR)上运行,并且不需要您更改构建工具,服务器基础结构,库,IDE等.我见过的大多数katas都很有趣,但不是"现实世界" - 像Euler等项目的数学挑战.这些似乎不合适,因为我们正试图探索将它用作一种实用的现实世界语言,人们可以考虑将其用于黑客和工作,并且因为人们不是
那么,有没有人遇到任何更实用的日常卡塔斯而不是算术上的"解决问题"?Katas,也就是说,可以测试语言,库和工具是否能够满足大多数人必须做的实际日常编程的用例,而不是测试.(并不是说不切实际的那些不好玩,但是不适合我被要求运行的那种东西.)
如果我找不到好的例子,我认为尝试建立类似图书馆目录的东西可能是有用的 - 这个活动适用于主要为大学(以及教育和文化 - 博物馆,画廊,学校,图书馆等).虽然这有点无聊,但这是与会者在日常生活中所做的事情.有什么建议?
在Scala中,我可以定义结构类型如下:
type Pressable = { def press(): Unit }
这意味着我可以定义一个函数或方法,它将一个可压缩的参数作为参数,如下所示:
def foo(i: Pressable) { // etc.
我传递给这个函数的对象必须为它定义一个名为press()的方法,该方法匹配类型中定义的类型签名 - 不带参数,返回Unit(Scala的void版本).
我甚至可以使用结构类型内联:
def foo(i: { def press(): Unit }) { // etc.
它基本上允许程序员拥有鸭子类型的所有好处,同时仍然具有编译时类型检查的好处.
C#有类似的东西吗?我用谷歌搜索但找不到任何东西,但我不熟悉C#的任何深度.如果没有,有没有计划添加这个?
如果我创建一个Git存储库并公开发布它(例如在GitHub上等),并且我从存储库的贡献者那里得到一个请求,无论出于何种原因删除或隐藏它们的名称,有没有办法轻松地这样做?
基本上,我有这样的请求,可能想用"匿名贡献者"或者他们的电子邮件地址或类似的东西替换他们的姓名和电子邮件地址.
我是学习Clojure的新手.这是我第一次也是非常简单的Clojure尝试,我在java代码中调用了一个简单的Clojure方法.不幸的是它不起作用.编译是成功的,并且从Clojure REPL开始,编写的函数按照它的顺序执行,但是从Java调用它时会说:
Exception in thread "main" java.lang.IllegalArgumentException: Wrong number of args (2) passed to: ClojNum$-myinc
at clojure.lang.AFn.throwArity(AFn.java:439)
at clojure.lang.AFn.invoke(AFn.java:43)
at com.experimental.clojure.test.ClojNum.myinc(Unknown Source)
at com.experimental.clojure.java.JavaCaller.main(JavaCaller.java:14)
Run Code Online (Sandbox Code Playgroud)
这是非常简单的Clojure代码:
(ns com.experimental.clojure.test.ClojNum
(:gen-class
:init init
:name com.experimental.clojure.test.ClojNum
:methods [
[myinc [int] int]
]))
(defn -init [] [[] (atom [])])
(defn myinc "comment" [x] (+ x 1))
(defn -myinc "comment" [x] (myinc x))
Run Code Online (Sandbox Code Playgroud)
而java部分:
package com.experimental.clojure.java;
import com.experimental.clojure.test.ClojNum;
public class JavaCaller {
/**
* @param args
*/
public static void main(String[] args) {
int i = …Run Code Online (Sandbox Code Playgroud) 这是一个场景:我有一个大文件,里面装满了我想要的各种折衷垃圾.我通过使用/命令并查看它突出显示的内容来摆弄并提出完美的搜索模式.
现在我想使用该模式替换.所以,我开始打字:%s/,我不记得模式是什么.是否有一些神奇的键盘命令会在这里引入我的上一个搜索模式?如果我正在编写一个特别复杂的正则表达式,我甚至打开了一个新的MacVim窗口,从第一个窗口输入正则表达式到那里的缓冲区,然后在写入替换模式时将其键入Vim窗口.必须有一个更好的方法.
如果我正在构建一个使用大量照片来说明服务的Web服务,那么实际检测照片是否聚焦将是有用的.
有没有办法以编程方式执行此操作?(更好的是,是否有这样的例程的开源实现?)
我编写了一个小库,它使用implicits来添加在Scala中使用REPL时只需要的功能.Ruby有这样的库 - 用于漂亮的打印,启动文本编辑器(比如从irb调用Vim的interactive_editor gem )- 看看这篇文章),调试器等.我正在尝试编写的库使用'pimp my library'隐式转换过程为java.lang.Class和java.lang.reflect类添加一些方法,以帮助您查找文档(最初使用Google,然后可能使用一个JavaDoc/ScalaDoc查看器,最终可能是StackOverflow API!).这是一个令人讨厌的图书馆:我花了很多时间将类名复制并粘贴到谷歌中,我想我也可以自动化这个过程.
这是开发人员想要添加到他们的系统中以便仅在REPL中使用的那种功能 - 他们不应该真正将它添加到项目中(部分原因是它可能不是他们的开发人员想要的东西,但也因为如果你正在做一些探索性的开发,它可能只是一个Scala REPL,它不是由IDE或构建工具调用的).
在我的情况下,我想包括几个类并设置一些含义 - 在CLASSPATH上包含一个.jar并基本上导入它.
在Ruby中,这是你要添加到.irbrc文件中的那种东西.其他REPL具有类似的设置选项和导入库的方法.
是否有类似的文件或方式为Scala REPL执行此操作?
我在Scala中构建了一个(命令行)应用程序,我希望将其作为独立的JAR进行分发.我用sbt构建它:
import sbt._
class Project(info: ProjectInfo) extends DefaultProject(info) with ProguardProject {
override def parallelExecution = true
override def mainClass: Option[String] = // whatever
override def libraryDependencies = Set(
// whatever
) ++ super.libraryDependencies
override def proguardOptions = List(
"-keepclasseswithmembers public class * { public static void main(java.lang.String[]); }",
"-dontoptimize",
"-dontobfuscate",
proguardKeepLimitedSerializability,
proguardKeepAllScala,
"-keep interface scala.ScalaObject"
)
}
Run Code Online (Sandbox Code Playgroud)
我可以sbt run很好地运行我的代码,我可以将它打包并运行ProGuard(我对混淆不感兴趣 - 项目无论如何都是开源的),我只是用它来生成一个独立的JAR) .所以,我最终得到一个内置于target/scala_2.8.0 /的.min.jar文件
这是它变得复杂的地方.如果我运行这个JAR,我得到:
线程"main"中的异常java.lang.SecurityException:Manifest主要属性的签名文件摘要无效
好的,我没有签名.
所以,我自己生成一个签名密钥如下:
keytool -keystore ~/.keystore -genkey -alias tom
Run Code Online (Sandbox Code Playgroud)
然后,按照Java文档,我尝试签署JAR:
jarsigner -signedjar [whatever].jar -keystore …Run Code Online (Sandbox Code Playgroud) 使用Git,如果您要提交,它会在提交消息下包含一个已注释掉的部分.其中包含有关编写提交消息的说明以及正在更改的文件列表.像这样:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: important-file.txt
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: some-other-thing.txt
# …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Circumflex ORM(在StackOverflow上建议 - 这里,这里和这里)通过JDBC从Scala项目(使用简单的构建工具构建)连接到本地(嵌入式)Apache Derby数据库.我仔细按照说明操作,但我遇到了一些有趣的问题.
这是cx.properties文件的驱动程序和URL组件:
orm.connection.driver=org.apache.derby.jdbc.EmbeddedDriver
orm.connection.url=jdbc:derby:derbyDB
Run Code Online (Sandbox Code Playgroud)
(这些映射到"反射驱动程序的实例创建和创建连接"模型与原始JDBC或persistence.xml中的等价物 - Circumflex使用一个简短而又甜蜜的属性文件,因为,你知道,它不是XML,这是一个很好的事情.)
我在sbt项目文件中添加的直接相关的依赖项是:
"ru.circumflex" % "circumflex-orm" % "1.0",
"org.apache.derby" % "derby" % "10.6.1.0"
Run Code Online (Sandbox Code Playgroud)
我创建了一个简短的示例模型,它定义了文档描述的表的简化版本:
import java.sql.DriverManager
import ru.circumflex.orm._
class Country extends Record[Country] {
val code = "code" VARCHAR(2)
val name = "name" TEXT
}
object Country extends Table[Country]
Run Code Online (Sandbox Code Playgroud)
这似乎编译好了,我可以实例化Country对象(使用sbt控制台调用的Scala 2.8.0 RC5 shell)并创建一个ActiveRecord对象样式,然后像这样保存:
val c = new Country
c.code := "US"
c.name := "United States of America"
c.save
Run Code Online (Sandbox Code Playgroud)
根据文档,这应该对对象运行验证,然后将其插入数据库.我得到以下异常:
java.sql.SQLSyntaxErrorException: Syntax error: Encountered "public" at …Run Code Online (Sandbox Code Playgroud) 我有一个使用Maven2的Java项目.能够获得可以访问已编译应用程序的完整类路径和所有库的REPL非常有用.在SBT中,对于纯Scala和混合Scala/Java项目来说这是微不足道的:我跑了sbt console.
但它对纯Java项目也非常有用.我并不担心什么语言:显然,Scala对此非常好,就像BeanShell一样,但是JRuby或者Jython或者Rhino或者Clojure也会很好地完成这项工作.基本上我希望能够以交互方式戳戳和刺激物体.
在没有BeanShell或Scala或任何添加为运行时/编译时依赖项的情况下,在Maven项目中设置REPL的最简单方法是什么?