这些时间在读《松本行弘的程序世界》,看到里面有关于字符串,编码和正则式等,有挺多是之前不知道的。

sort 与 sort_by 区别

ary.sort do |a,b|
  a.to_i <=> b.to_i
end

sort每次都会执行块处理,如上面的代码,每次比较都要进行整数转换,比较浪费资源,而且不是线性增长的。
sort_by用执行块的代码所生成的结果进行排序,对每个元素只执行一次块的调用。但会占用更多的内存:ary.sort_by{|x| x.to_i}

Encoding

Unicode 5.0 已经收入9万多字,已经超出了65536的范围。
UTF-8 作为可变长的,与 ASCII 具有兼容性的字符编码方式。将 ASCII 字符串当做 UTF-8 字符串来处理也不会有问题。

几乎多有情况下,文本数据都不附带文字编码方式的信息,所以容易引起错误。
使用 UCS 方式的编程语言会在输入输出时对文本做统一处理。
Ruby 使用 CSI,不会对文本做任何处理,成为少有的例外。

Regex

  • 后面跟一个?就会进行懒惰匹配(第一次与模式匹配时就停止检索)。
  • (.)\1是指匹配两个相同的字符,在后面使用匹配的字符串称为向后引用。
  • |与其他正则表达式元素比,优先级要低,yes|no会解释为yes或者no(不同于ye(s|n)o的匹配结果)。
  • 匹配文件路径时会有很多的/要转义,即要写成\/,使用%r{}可以避免,{}可以换成别的,成对出现就可:%r!/usr(/local)?/bin!
  • $& 最后的匹配字符串
  • $` 位于匹配前的字符串
  • $' 位于匹配后的字符串
  • $+ 匹配最后括号的字符串
  • $n 匹配第n个括号内的字符串
  • \&\0 整个匹配部分的字符串
"a,b:c".split(/[:,]/)
#=> ["a", "b", "c"]

#匹配html标签
str.split(/<.*?>/)   #=>不包括html标签
str.split(/(<.*?>)/) #=>返回的数组中包含html标签

RSA

(后来我认真搜了一下发现还是有一些数学理论的,感觉要自己写代码生成密钥还是挺复杂的)
这是一个RSA加密的小程序,
现实中pq的长度为1024位(二进制),这里并不考虑效率
(pq, e) 为公钥,(pq, d) 为私钥
p,q为两个素数

pq = p * q
k = n * (p - 1) * (q - 1) + 1
n为任意正数
e, d 能使 e*d = k


def rsa(pq, k, mesg)
  mesg.collect do |x|
    x**k%pq
  end
end


orig = [7, 13, 17, 24]
encode = rsa(33, 3, orig)
#=> [13, 19, 29, 30]
decode = rsa(33, 7, encode)
#=> [7, 13, 17, 24]