swift optionals

作者:JerryXia | 发表于 , 阅读 (18)
swift中一个objective-c没有的概念就是optionals. optionals在作用上类似于objc中的nil pointer, 但更加安全。
Optional的基础用法class Animal {func name() -> String { return "animal" }}var a1: Animal?a1 = Animal()a1!.name()   // animalvar a2: Animal?a2?.name()   // nila2!.name()   // runtime errorvar a3: Animal = nil // compiler errorvar a3: Animal = a2  // compiler erroroptional有两种状态,一种是nil, 一种是某个对象的值.
使用在类型名后加?的方式来创建一个optional.
optional可以像赋予对象,也可以赋予nil。
普通变量不可以赋nil, 也不可以赋optional。(均为 compiler error)
当需要取optional里面对象的值时,使用?或者...阅读全文

正则表达式中的各种分组方式

作者:JerryXia | 发表于 , 阅读 (28)
在使用正则表达式时,我们常常用()来表示分组,例如:
>>> re.search(r'(a(b))', 'xaby').groups()('ab', 'b')有时我们不需要返回这个分组,只是想用括号来表示语义逻辑,例如:
>>> re.search(r'(a(b|c))', 'xaby').groups()('ab', 'b')我们只想表示a的后面是b或者c,但是不想把b或者c当作一个分组返回。此时可以使用非捕获的分组(non-capturing group), 语法为(?:):
>>> re.search(r'(a(?:b|c))', 'xaby').groups()('ab',)如果我们希望表达的意思是a的后面有b或c,但匹配后只返回a,可以用positive look ahead, 语法为(?=):
>>> re.search(r'(a(?=b|c))', 'xaby').groups()('a',)类似的,如果想匹配a的后面不是某个pattern,可以用negative look ahead, 语法为(?!)
>>> re.search(r'(a(?!c|d))', ...阅读全文

Haskell Notes (2)

作者:JerryXia | 发表于 , 阅读 (30)
Haskell Notes (2)Oct 29, 2016
MonadsA monad is an  algebraic structure in category theory, and in Haskell it’s used to describe computations as a sequece of steps, and to handle side effects such as state and IO. It is used to allow actions(e.g. mutable variables) to be implemented safely.
hello :: String -> IO Stringhello x =doputStrLn ("Hello, " ++ x)putStrLn "What's your name?"name <- getLinereturn nameA monad in Haskell consists of  a do keyword and a sequence of commands. To extract infor...阅读全文

Haskell Notes

作者:JerryXia | 发表于 , 阅读 (19)
defining functionsHaskell is a functional programming language. This basically means functions are first-class citizens.Let’s look at how to define a function.
add x y = x + yadd 1 23functions are partialIn haskell, functions can be partially applied (applied with less arguments than defined)
add1 = add 1add1 23If we apply add with only one argument 1, then we get a new function add1 which takes one argument.
infix and prefixIn haskell, infix functions (i.e. operators in other languages) and ...阅读全文

ReactiveCocoa 代码阅读笔记 (2) Signal的实现机制

作者:JerryXia | 发表于 , 阅读 (20)
上篇讲了RAC和RACObserve两个宏的实现机制,但都是把RACSignal当作一个黑盒来理解。本篇详细讲解Signal的内部机制。
创建SignalSignal有很多种创建方式,例如[UITextView rac_textSignal]是用signalForSelector:的方式。这里我们先看看自定义创建的Signal:
// RACSignal.m+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {return [RACDynamicSignal createSignal:didSubscribe];}// RACDynamicSignal.m+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {RACDynamicSignal *signal = [[self alloc] init];signal->_di...阅读全文