类似于java中switch
当数据满足某一个分支时,执行完毕后,就直接跳出
case分支类似于default语言, 分支匹配其实就是顺序匹配
如果数据没有匹配任何规则,会发生错误
// val age = 20
//
// age match {
// //case _ => println("other")
// case 10 => println("age = 10")
// case 30 => println("age = 30")
// }
var a: Int = 10
var b: Int = 20
var operator: Char = '+'
var result = operator match {
case '+' => a + b
case '-' => a - b
case '*' => a * b
case '/' => a / b
case _ => "illegal"
}
def describe(x: Any) = x match {
case 5 => "Int five"
case "hello" => "String hello"
case true => "Boolean true"
case '+' => "Char +"
}
def describe(x: Any) = x match {
case i : Int => i + 10
case s : String => "String hello"
case m: List[_] => "List"
case c: Array[Int] => "Array[Int]"
case someThing => "something else " + someThing
}
scala中类型匹配时,是不考虑泛型的,但是Array类型是特殊的。
类型匹配注意
Array[Int], 这里的Int不是真正的泛型
java中的写法 => String[]
scala中的写法 => Array[String]
Array[Int] 是一个整体
List[Int] 是类型加泛型
不考虑泛型演示
case m: List[Int] => "List"
println(describe(List("1", "2", "3"))) ==> List
case m: List[string] => "List"
println(describe(List(1, 2, 3))) ==> List
for (arr <- Array(
Array(0),
Array(1, 0),
Array(0, 1, 0),
Array(1, 1, 0),
Array(1, 1, 0, 1),
Array("hello", 90))) { // 对一个数组集合进行遍历
val result = arr match {
case Array(0) => "0" //匹配Array(0) 这个数组
case Array(x, y) => x + "," + y //匹配有两个元素的数组,然后将将元素值赋给对应的x,y
case Array(0, _*) => "以0开头的数组" //匹配以0开头和数组
case _ => "something else"
}
println("result = " + result)
}
result = 0
result = 1,0
result = 以0开头的数组
result = something else
result = something else
result = hello,90
for (list <- Array(
List(0),
List(1, 0),
List(0, 0, 0),
List(1, 0, 0),
List(88))) {
val result = list match {
case List(0) => "0" //匹配List(0)
case List(x, y) => x + "," + y //匹配有两个元素的List
case List(0, _*) => "0 ..."
case _ => "something else"
}
println(result)
}
0
1,0
0 ...
something else
something else
for (tuple <- Array(
(0, 1),
(1, 0),
(1, 1),
(1, 0, 2))) {
val result = tuple match {
case (0, _) => "0 ..." //是第一个元素是0的元组
case (y, 0) => "" + y + "0" // 匹配后一个元素是0的对偶元组
case (a, b) => "" + a + " " + b
case _ => "something else" //默认
}
println(result)
}
0 ...
10
1 1
something else
通过伴生对象定义unapply方法来进行对象之间的相互匹配
def main(args: Array[String]): Unit = {
// TODO - 模式匹配 - 匹配规则
// 匹配对象
// apply : Attribute => Object
val user = getUser()
// unapply : Object => Attribute
user match {
case User("zhangsan",40) => println("用户为张三")
case _ => println("什么也不是")
}
}
class User {
var name:String = _
var age:Int = _
}
object User {
// Object => Attribute
def unapply(user: User): Option[(String, Int)] = {
Option( (user.name, user.age) )
}
// Attribute => Object
def apply( name : String, age:Int ) = {
val user = new User()
user.name = name
user.age = age
user
}
}
def getUser() = {
User("zhangsan", 30)
}
val (_, name, _) = (1, "zhangsan", 30)
println(name) ==> zhangsan
val map = Map(
("a", 1), ("b", 2), ("c", 3)
)
for ( (k, 2) <- map ) {
println( k ) ==> b
}
val list = List(
(("河北", "鞋"), 10),
(("河北", "衣服"), 20),
(("河北", "电脑"), 15),
)
list.map(
(t) => {
t
}
)
// 下面的代码中,使用模式匹配需要注意:
// 1. 匹配数据时,需要使用case关键字
// 2. case分支可能存在多个,那么需要将map的小括号换成大括号
val list1 = list.map {
case ((prv, item), cnt) => {
(prv, (item, cnt * 2))
}
}
在编译时,会自动生成大量的方法
def main(args: Array[String]): Unit = {
val user = getUser()
user.name = "lisi"
user match {
case User("zhangsan",40) => println("用户为张三")
case _ => println("什么也不是")
}
}
case class User(var name:String, age:Int)
def getUser() = {
User("zhangsan", 40)
}
以偏概全
全量函数 :函数进行处理时必须对所有的数据进行处理。
val list = List(1,2,3,4)
// map只支持全量函数操作
// 1 => 2
// 2 => Unit
// 3 => 6
// 4 => Unit
val list1 = list.map(
num => {
if ( num % 2 != 0 ) {
num * 2
}
}
)
println(list1) ==> List(2, (), 6, ())
偏函数 : 函数进行处理时只对满足条件的数据进行处理
// 将该List(1,2,3,4,5,6,"test")中的Int类型的元素加一,并去掉字符串
val list : List[Any] = List(1,2,3,4,5,6,"test")
val list1 = list.map {
case i : Int => { // 只匹配Int类型
i + 1
}
case other => other
}.filter(_.isInstanceOf[Int])
println(list1)
val list : List[Any] = List(1,2,3,4,5,6,"test")
val list1 = list.collect{
case i : Int => i + 1
}
println(list1)
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub