如何設計出漂亮的 Ruby APIs

Python011

如何設計出漂亮的 Ruby APIs,第1张

1.Argument Processing

Ruby 使用了 Symbols 和 Hash 来达到虚拟关键字参数(Pseudo-Keyword Arguments)。这种技巧被广泛应用在 Ruby 的函式库和 Rails 中,增加了阅读性,也很容易使用。

def blah(options)

puts options[:foo]

puts options[:bar]

end

blah(:foo =>"test", :bar =>"test")

Ruby 也可以将参数列当成阵列使用:

def sum(*args)

puts args[0]

puts args[1]

puts args[2]

puts args[3]

end

sum(1,2,3)

如此就可以设计出不固定参数列、十分弹性的 API。类似於 C++ 的 function overloading。在 Rails 中也十分常见这样的 API 设计,例如 link_to 就支援了两种用法:

# USAGE-1 without block

<% link_to 'Posts list', posts_path, :class =>'posts' %>

# USAGE-2 with block

<% link_to posts_path, :class =>'posts' do %>

Posts list

<% end %>

搭配虚拟关键字参数使用的话,可以参考 ActiveSupport#extract_options! 这个小技巧取出 Hash 值。

2. Code Blocks

程式区块(Block)是 Ruby 最重要的特色,除了拿来做迭代(Iteration)之外,也可以包装前後置处理(pre- and Post-processing),一个最基本的例子就是开档了,一般程序式的写法如下:

f = File.open("myfile.txt", 'w')

f.write("Lorem ipsum dolor sit amet")

f.write("Lorem ipsum dolor sit amet")

f.close

使用 Block 之後,我们可以将 f.close 包装起来,不需要明确呼叫。只要程式区块结束,Ruby 就会自动关档。程式一来因为缩排变得有结构,二来也确定档案一定会关闭(不然就语法错误了)

# using block

File.open("myfile.txt", 'w') do |f|

f.write("Lorem ipsum dolor sit amet")

f.write("Lorem ipsum dolor sit amet")

end

另一个程式区块的技法,是用来当做回呼(Dynamic Callbacks)。在 Ruby 中,程式区块也是物件,於是我们可以将程式区块如透过”注册”的方式先储存下来,之後再依照需求找出来执行。例如在 Sinatra 程式中:

get '/posts' do

#.. show something ..

end

post '/posts' do

#.. create something ..

end

我们”注册”了两个回呼:一是当浏览器送出 GET ‘/posts’ 时,会执行 show something 的程式区块,二是 POST ‘/posts’ 时。

3. Module

模组(Module)是 Ruby 用来解决多重继承问题的设计。其中有一招 Dual interface 值得一提:

module Logger

extend self

def log(message)

$stdout.puts "#{message} at #{Time.now}"

end

end

Logger.log("test") # as Logger’s class method

class MyClass

include Logger

end

MyClass.new.log("test") # as MyClass’s instance method

Ruby 的 extend 作用是将模组混入(mix-in)进单件类别(singleton class),於是 log 这个方法除了可以像一般的模组被混入 MyClass 中使用,也可以直接用 Logger.log 呼叫。

要将 Ruby 模组的混入成类别方法(class method),也有一些常见的 pattern 模式,可以将模组设计可以同时混入实例方法(instance method)和类别方法,请参阅投影片范例。这在撰写 Rails plugin 时非常常用。

4. method_missing?

Ruby 的 Missing 方法是当你呼叫一个不存在的方法时,Ruby 仍然有办法处理。它会改呼叫 method_missing 这个方法,并把这个不存在的方法名称传进去当做参数。这个技巧在 Rails 的 ActiveRecord 中拿来使用:

class Person <ActiveRecord::Base

end

p1 = Person.find_by_name("ihower")

p2 = Person.find_by_name_and_email("ihower", "[email protected]")

其中 find_by_name 和 find_by_email 就是这样的方法。不过这个技巧不是万能丹,它的执行效率并不好,所以只适合用在你没办法预先知道方法名称的情况下。不过也不是没有补救之道,如果同样的方法还会继续呼叫到,你可以在 method_missing 之中用 define_method 或 class_eval 动态定义此方法,那麼下次呼叫就不会进来 method_missing,进而获得效能的改善。事实上,ActiveRecord::Base 的 method_missing 就是这麼做的。(感谢 BigCat 留言提醒我有此补救之道)

另一个 Missing 方法的绝妙 API 设计,是拿来构建 XML 文件:

builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)

builder.person do |b|

b.name("Jim")

b.phone("555-1234")

b.address("Taipei, Taiwan")

end

# <person>

# <name>Jim</name>

# <phone>555-1234</phone>

# <address>Taipei, Taiwan</address>

# </person>

搭配了区块功能,就能用 Ruby 语法来写 XML,非常厉害。

5. const_missing

除了 method_missing,Ruby 也有 const_missing。顾名思义就是找不到此常数时,会呼叫一个叫做 const_missing 的方法。现实中的例子有 Rails 的 ActiveSupport::Dependencies,它帮助我们不需要先载入所有类别档案,而是当 Rails 碰到一个还不认识的常数时,它会自动根据惯例,找到该档案载入。

我们也可以利用这个技巧,针对特定的常数规则来处理。例如以下的程式会自动将 U 开头的常数,自动转译成 Unicode 码:

class Module

original_c_m = instance_method(:const_missing)

define_method(:const_missing) do |name|

if name.to_s =~ /^U([0-9a-fA-F]{4})$/

[$1.to_i(16)].pack("U*")

else

original_c_m.bind(self).call(name)

end

end

end

puts U0123 # ģ

puts U9999 # 香

6. Methods chaining

方法串接是一个很常见的 API 设计,透过将方法的回传值设成 self,我们就可以串接起来。例如:

[1,1,2,3,3,4,5].uniq!.reject!{ |i| i%2 == 0 }.reverse

# 5,3,1

7. Core extension

Ruby 的类别是开放的,可以随时打开它新增一点程式或是修改。即使是核心类别如 Fixnum 或是 Object(这是所有类别的父类别) 都一样。例如 Rails 就定义了一些时间方法在 Fixnum 里:

class Fixnum

def hours

self * 3600 # 一小时有多少秒

end

alias hour hours

end

Time.now + 14.hours

Ruby 的物件模型与元编程(Meta-programming)

在 Ruby 中,所有东西都是物件。甚至包括类别(class)本身也是物件。这个类别物件(class object)是一个叫做 Class 的类别所实例出来的物件。而所有的物件(当然也包括类别物件),都有一个 metaclass (又叫做 singleton, eigenclass, ghost class, virtual class 等名字)。定义在 metaclass 里的方法,只有该物件能够使用,也就是 singleton method (单件方法),只有该物件才有的方法。

了解什麼是 metaclass 是 Ruby 元编程的一个重要前提知识。Ruby 元编程最常用的用途,就是因应需求可以动态地定义方法,例如在 Rails ActiveRecord 中常见的 Class Macro 应用。

要能随心所欲动态定义方法的关键重点,就是 variable scope (变数的作用域) 了。例如以下我们透过 class_eval 和 define_method 帮 String 定义了一个 say 方法,注意到整个 variable scope 都是通透的,没有建立新的 scope:

name = "say"

var = "it’s awesome"

String.class_eval do

define_method(name) do

puts var

end

end

"ihower".say # it’s awesome

class_eval 可以让我们改变 method definition 区域(又叫做 current class)。除了本投影片,建议可以阅读 Metaprogramming in Ruby: It’s Allhe Self 和 Three implicit contexts in Ruby 这两篇文章深入了解 self 和 current class。

8. Class Macro (Ruby’s declarative style)

Class Macro 是 Ruby Meta-programming 非常重要的一个应用,例如在 Rails ActiveRecord 中:

class User <ActiveRecord::Base

validates_presence_of :login

validates_length_of :login,:within =>3..40

validates_presence_of :email

belongs_to :group

has_many :posts

end

习惯是人生的主宰

培根说:“习惯是人生的主宰”。习惯即命运。 一只木桶盛水的多少,取决于最短的木板,而与最长的木板无关。人的失败往往由自己的某种缺陷所致。 好的习惯是人们走向成功、财富的钥匙,而坏的习惯是通向贫穷的敞开的门。

何谓习惯?

习惯是一种定型的行为,是长时期逐渐养成的语言、思维、行为等生活的方式。归根到底,是一种条件反射。教育家认为,行为一旦变成了习惯,就会成为人的一种需要。

不实用的购物习惯

你有没有注意过自己买回来的物品中,有很多是“无用之物”。 Lisa在大病一场后,决定听从医生的建议增加健身时间和费用预算。半年前,她和先生特意赶到一家健身会所了解健身年卡的消费规则;经过一番比较与讨价还价,他们俩以原价的65%购得两张全时段健身卡,总共花费了6500元。此后一段时间,他们选择周末结伴健身,但坚持不到两、三个月,Lisa锻炼的兴致就没了。 仔细算一下,Lisa夫妇一共才去健身会所锻炼9次,若按单次消费的价格120元/人计算,仅需支付2169元。但他们却为9次健身,花费了6500元,而Lisa的月薪也不过是4200元。

与Lisa的购物经历相同,两年前,Alex与Neil从市中心搬迁到市郊后,决定买一部跑步机。有了这个想法后,他们逛了好几家体育用品商店,花了大约12000多元买了一部跑步机,虽说价格不便宜,但他们比起市中心健身会所的年卡还是一项划算的“长期投资”。刚买来不久,Alex与Neil经常“抢着”使用机器,但才过一个月,俩人的跑步兴趣便淡下来了。现在,每个月他们使用这部机器的频率不会超过5次,而且锻炼热情也从跑步转移到打羽毛球上了。

或许,这只是Lisa、Alex与Neil买过的众多“无用物”其中之一的例子罢了。大部分东西,都是买了之后,只用过一段很短时间后,就再用不上了。事实上,这些东西都不是他们真正需要的,他们之所以买这么多的“不实惠的无用之物”,都是得了一种“宁可多买”的购物习惯。而改变、控制这种习惯的有效措施是,在买东西之前彻底想清楚:“我是真的需要买这个东西,还是为了瞬间的满足感?”另外一个办法是延迟大笔购物的时间,或许过一段时间后,你会发现自己并不是真的需要这些东西。

追求表面奢华的习惯

在大多数人认为,成功就意味着开新型豪华汽车,持银行金卡,戴名表,穿名牌衣服、鞋子,住豪华房子。我们都羡慕拥有这一切的人,认为他们的生活肯定比我们好。可你哪里知道,那些拿着外在美好生活装饰物到处摆谱的人,实际上,他们不过是在租用一种自己根本负担不起的生活方式。

Ruby夫妇俩是一对典型的“月光族”。Ruby和她老公都在外资公司工作,公婆还拥有一家服装公司,因此,他们虽说每月收入高达2、3万,但来得快花得也快。Ruby怀孕了,老公及四位老人不允许她独自驾车上下班,而老公已拥有一辆本田车,听说车子不经常使用挺容易出故障的,夫妻俩便决定将Ruby的Polo车卖掉。这辆Polo车买来不到一年,Ruby消耗的公里数刚过6800公里,但转手卖掉的价格只有新车的70%,还不包括上牌的一系列费用。从买来到卖出的不到一年间,Ruby就损失了5万多元。

前不久,这对小夫妻路过一家汽车销售公司,被一辆进口新款宝马车吸引,最后,在年终清仓折扣的诱惑下买入这辆新车,总共花费了84万元。现在,Ruby老公将他自己那辆本田车冷落在车库里。但每个月的停车费、每年的维修保养费还是省不了,算算每个月的养车费竟高达3、4千。

在国内,像Ruby夫妇这么爱车、买车的人不多。个人理财顾问认为,任何商品的总成本,除包括购买和运转两大直接成本外,还包括“机会成本”。这个机会成本是指你可以用这笔钱做其它的用途。还是以Ruby夫妇为例,他们将84万元用于买车,就无法得到储蓄或投资的收益。 Ruby夫妇可以用这84万元买一套住房,三四年后,房子的价格会上涨,而他们的汽车价值却在急剧下降。做汽车生意的朋友告诉我,一辆车出问题大多发生在新车出厂后的5000公里到10000公里之内,因此,买入开过12--18个月的二手汽车可能是最划算的,它仍然和新的差不多好,但价格却便宜得多。就二手车的价格看,即便是转手卖掉一辆刚上路不久的新车,也必然会掉价30%或者更多。

事事难以预料,Ruby老公因年少气盛与他的台湾主管发生了争吵,最终恨恨地离开了公司。在失业的过程中,他发现自己不仅失去了富足生活的物质招牌,同时也失去了自己的身份;过去他将大部分时间用来上班、应酬、挣钱、付帐单和装点表面生活,那些“成功”都是为了“秀”给别人看,而丢掉了工作便没有了保持良好形象的必要了!

轻视小钱的习惯

很多时候,人们喜欢用小钱博大钱,林强就是这样:一周只不过花50元,但博到的奖金可就是100万、500万元! 俗话说:穷人买彩票,富人买股票。但林强却有买彩票的习惯,虽然他还是一家上市公司的部门经理。林强每周总要抽出50元购买“天天彩、双色球”;自第一次购买至今已有五年多了,他的理论是:只要将这个习惯保持十年,必定有一次中大奖的可能。但至今,他最大的中奖额也仅为1000元,不过中奖的次数倒有3次。 我们不妨为林强算笔帐:一年52周,每周花费50元;五年,总共花彩票上的费用是13000元;扣除他三次的中奖额,他在彩票上的“沉没成本”正好是1万元。

在大多数富翁看来,玩彩票就像赌博,玩者根本无法知道总的数目,所以也无法知道中彩的可能性或期望值。比如说,共有450万张彩票,你买了一张,你赢的机会是450万分之一,而你期望的是100万元人民币。按照风险与回报率看,大多数彩票游戏是玩家必输的游戏。 假设林强将他每月买彩票的钱用于投资,购买的是年收益率5%的基金,采用的是定期定额固定投资法,并将每年的分红转为再投资,这样,五年来他可得的投资本金及收益总共为1.5万元;若按10%的复利计算,五年的本息和是1.746万元,十年则高达4.558万元。这就是轻视小钱所付出的昂贵代价!

不理性的用钱习惯

如果你现在有足够的钱去付清住房抵押贷款,你会怎样做? 大多数人会提前还清贷款,然后享受没有还款压力的良好感觉。这是一个用钱的习惯问题,而不是经济学家所说的金融话题。这怪你的父母,你所有的关于金钱的态度、习惯源于你的父母。

Joy在一家美资500强公司任物流主管,月收入不菲,但她的用钱习惯非常传统。每个月的收入扣除基本生活费用后,她将余钱存入银行;每逢春节,她总要取出所有的储蓄存折,然后一笔一笔地计算,看看自己积累了多少钱?Joy非常喜欢数钱时的感觉,这让她感到安全与满足。小时候,她总在年终时看到劳作一年的父母计算工分,然后从村会计那里领钱。

2002年,Joy准备在市中心买一套住房。买房的总价与她的积蓄有一定的距离,Joy便听从售楼小姐的建议采用抵押贷款的方式买房。至今,Joy还拥有十多万元的抵押贷款,虽然银行存款额显示她完全有能力还清这部分借款,但喜欢占有实实在在金钱的习惯让她放弃了提前还款的念头。

个人理财顾问对Joy的习惯感到惋惜,不妨让我们看看,Joy为她的习惯付出了多少代价。若按现行的住房商业贷款利率计算,她的借款年利率为5.04%,但她近十万元存款的一年期储蓄利率为税后1.584%,两者的利差为3.456%。你可以这样想象,银行在前台收了Joy的储蓄额,经过银行内部的几道流程后,在后台又将这笔钱“借给”了Joy;就像把左口袋的钱挪到右口袋,但Joy却让银行白白赚了3.456%的利差。十万元的借款,一年损失就是3456元,十年就是34560元,还没有计算这部分钱的利息!

记得有哲人说,我们真正的敌人就是自己。很多习惯之所以不易纠正,因为这是多年积累、逐步养成的;即便现在有意识重新建立好的习惯,却是困难重重!很多时候,我们知道什么是好,但具体做起来遇到障碍的原因是难以与“多年的习惯”抗衡。因为我们处在习惯中,大多数人便不知习惯的好坏,也从来没有算计过哪些习惯能为我们的生活加分,又有哪些习惯让我们不断地“坏帐”……

一月诞生石——石榴石(garnet)

Garnet由拉丁文“granatum"演变而来,意思是“像种子一样”。石榴石是人间最资深的宝石,从古埃及时代开始,人们就视石榴石为太阳神制造出来的圣物,因为它在阳光下闪耀着太阳般的光辉。神话中,石榴石是隐藏不住的,即使在黑暗中也看得清楚它那火焰般的红色光彩,诺亚就曾把石榴石挂在方舟中照明。在中东,石榴石被选做王室信物。许多波斯人将石榴石常常作为君主的偶像而崇拜。古埃及人和腓尼基人认为石榴石可以温暖人心,让持有者拥有平静的心情和永不间断的爱情,并得到看透人世一切的能力,因而人们不但把它做为装饰物,还当做避邪物和护身符佩戴在身上。它的石语就是:贞操、友爱和忠诚。

二月诞生石——紫水晶(amethyst)

Amethyst在希腊语中原意是“不易破碎”。它是天主教的司教石,并被视为皇族的象征。在希腊神话中,月亮女神阿尔忒弥斯有次和酒神狄奥尼索斯起了冲突。恼怒的酒神宣布要让他遇到的第一个女人被老虎吃掉。恰巧一名漂亮的少女Amethyst经过,酒神便唤一只凶恶的老虎冲向少女。危难之中月神把少女变成了一块纯洁的水晶来保护她。这时酒神幡然醒悟,为表示歉意,便将葡萄酒倒在Amethyst石化的躯体上,从此水晶便有了美丽的紫色。古人认为紫水晶能促进人们舒缓压力,互相谅解,澄净心灵,并且它最出名的功效,拜狄奥尼索斯所赐,就是能治疗酒鬼。它的石语就是:平和、诚挚和善良。

三月诞生石——海蓝宝石(aquamarinl)

Aquamarinl来源于拉丁文“海水”。它是祖母绿的姐妹石,因其清澈湛蓝如海水的色泽而得名。在希腊神话中,海蓝宝石产于海底,由老海神涅柔斯的女儿——50个海洋女神们的眼泪化成,是海水的精华。希腊人认为海蓝宝石能让航海员消除恐惧,并消除海难的神奇力量,因而它长期以来被人们奉为"勇者之石"。传说佩带海蓝宝石能使人具有先见之明。它还具有催眠和镇邪的力量,并被看成幸福和永保青春的标志,因此海蓝宝也常被用来当作结婚纪念石。它的石语就是沉着、勇敢和聪明。

四月诞生石——钻石(diamond)

Diamond来源于希腊文“Adamas”,意为坚硬无比,不可征服。古人视钻石为最纯净之物。在梵文中钻石一词即为雷电之意,借以表达钻石由闪电而生的信仰。埃及人认为,无名指的血脉是直接引进心房的爱情之脉,象征爱情永恒不变。古希腊人相信钻石是陨落到地球上的星星碎片,甚至有人认为钻石是天神滴落的眼泪;人们也一度认为钻石是由天水或天露而来。

在中世纪末期,在一些有关宗教的书籍中,描写大祭师亚伦的胸牌和新耶路撒冷的基石因镶有钻石而具有神力。按基督教的习俗,钻戒应戴在无名指上,据说是因为神父用戒指顺序轻触新人左手的三只手指,并说“奉圣父、圣子、圣灵之名”,最后正好落在无名指上。因此,自1477年奥地利大公麦西米伦与法国勃艮地的玛丽公主将钻戒作为订婚信物,到15世纪法王查理七世开启平民也可拥有钻石之风,上至达官显贵下至平民百姓,相爱的男女无不期待着自己能被箭端镶满钻石的丘比特“爱神之箭”射中,更相信佩戴在左手无名指上的钻戒,将爱情之脉通过指尖与心相连,心心相印。它的石语就是纯洁、高贵以及……权力。

五月诞生石——祖母绿(emerald-beryl)

祖母绿的名称起源于古波斯语,后演化成拉丁语smaragdus,又讹传成esmeraude、emeraude或emeralde。而成为现代的英语拼写形式,则可回朔到十六世纪左右。它的历史是一个由传说和迷信纠织在一起的网。早在罗马时代,祖母绿被认为是爱神维纳斯的宝石,因而恋人们认为它具有提示被爱者忠贞与否的魔力。

祖母绿鲜艳的绿色在古代就被视为奇迹,罗马诗人小普林尼曾经给予这种绿色高度评价:“确实,没有任何一种宝石具有更赏心悦目的颜色,对眼睛来说是那么感到舒服,特别是,每当目不转睛地停留在嫩嫩的草坪和树叶的时候,但,这与祖母绿的色泽来说,祖母绿更加令人感到快慰。可以说,没有任何绿色是那么浓。除了各种贵重宝石外,它是唯一能使人百看不厌的宝石。不论是阴是晴,或是人工光的效果不使它呈现何种变化,它总是发出又柔和又浓艳的光芒。”它被认为代表忠诚、仁慈和善良。

六月诞生石——珍珠(pearl)

很少有珠宝像珍珠一样,不经研磨就自然散发柔和美丽的光彩。自古以来,有关珍珠的传说不计其数。在东方,珍珠自古以来就代表着女性与月亮,是健康、长寿与美容的象征古今中外历代宫廷皇妃无不以珍珠作为养颜葆春的珍品。

传说,珍珠一直被认为是诸神送给大地的礼物,地位神圣。事实上,除了以上天恩赐作解释外,实在无法明了一只平凡的蚝片竟可内藏如斯完美的宝物。中国神话中传说珍珠乃是人鱼之泪化成,因此才格外的晶莹剔透;古代印度传说珍珠是海底的贝浮到海面上,吸收了天上降下的雨露而育成;波斯的神话故事显示珍珠不但象徵光明的希望,更是由诸神的眼泪变成;而罗马人则将一颗珍珠的诞生与爱神维纳斯拉上关怀,传说当爱神由充满泡沫的蚝壳沐浴完毕走出来时,其身上滴下的水珠被她发出的动人光彩凝集结成珍珠。

珍珠也是人类最早利用的珠宝之一。《圣经》的开篇“创世纪”中记载:从伊甸园流出的比逊河,“在那里有珍珠和玛瑙”。据《法华经》、《阿弥陀经》等记载,珍珠是“佛家七宝”之一。我国是世界上最早利用珍珠的国家之一,远在大禹时代,就将南海“玑珠大贝”作为贡品,汉朝时广西合浦已有采珠业。

七月诞生石——红宝石(ruby-corundum)

Ruby来自拉丁语ruder,意思为“红色”。数千年来,红宝石一直是世界上最有价值的宝石。传说红宝石是上帝在创造万物时所创造的十二种宝石中最为贵重的。按上帝的旨意,这一“宝石中的贵族”被置于亚伦的颈上。事实上,即使是在今天,顶级红宝石仍比顶级无色钻石更稀少更有价值。红宝石以其瑰丽、清澈、华丽的风姿,被喻为“爱情之石”。人们认为佩戴她会使人幸福美满、逢凶化吉。在印度梵文中红宝石(RUBY)的意思就是宝石之王,象征着永不熄灭的圣火。人们常用许多美丽的词藻来形容红宝石的华丽高贵。在梵语中,红宝石有许多名字,譬如“ratnaraj”(宝石之王),“ratnanayaka”(宝石之冠)等等。所有这些名字显然说明,印度人比别的民族更珍视这种宝石。红宝石也许是我们的祖先所见到的颜色强度最大的一种物质。难怪他们这样来形容这些火焰的魔术般的力量:这些红色的火焰将不断地燃烧,永不熄灭。

古代,围绕着红宝石流传着许许多多的传说和奇异的宗教信条。有一种传说认为,戴红宝石的人会健康长寿,发财致富,聪明智慧,爱情美满幸福。而且,左手戴上一个红宝石戒指或左侧戴一枚红宝石胸饰,就会具有一种逢凶化吉,变敌为友的魔力,古罗马人将红宝石统称为“carbunculus”(红榴石)。普林尼说道、宝石工很善于仿制红宝石,他们将金属薄片放在其下,造成光彩夺目的好火。他还写道:“据传说,埃塞俄比亚人将他们的暗色和黑色红石榴浸在醋里,经过14天后,变成纯洁可爱,并能保持14个月。”它的石语就是热情、仁爱和尊严。

八月诞生石——贵橄榄石(peridot)

Peridot又名olivine,前者来源于法文,而后者为矿物学名词。橄榄石黄绿色相结合,黄色象征高贵,绿色象征希望,被人誉为“黄昏的祖母绿”。夏威夷人的传说中称橄榄石是火山女神佩勒流出的眼泪。圣经上也记载着,高级神职人员的护胸甲上面点缀的12颗宝石,代表以色列的12个部族,其中一颗就是橄榄石。古人认为佩戴它,能祛除人们对黑夜的恐惧,带给人以温和的性格和良好的听觉。埃及人称橄榄石为“太阳的宝石”,相信它有太阳的力量,佩戴它可消除夜间的恐惧;人们相信橄榄石所具有的力量像太阳一样大,可以驱除邪恶,降伏妖术。古代的一些部族之间发生战争时,常以互赠橄榄石表示和平。在耶路撒冷的一些神庙里至今还有几千年前镶嵌的橄榄石。

橄榄石被喻为太阳宝石,人们认为它充满能量,具有医疗的功效。远在3500年前的古埃及时代,红海上的圣约翰岛即有橄榄石矿产的开发纪录,在中世纪时,十字军将橄榄石传入欧洲,在巴洛克时期曾是红极一时的装饰宝石。从那时起,欧洲把橄榄石列为“八月诞生石”,象征温和聪敏、家庭美满和夫妻和睦。

九月诞生石——蓝宝石(sapphire-corundum)

Supphire来自拉丁语Spphirus,在其它语系中也有类似词根:如希腊语Sappheires,希伯来语Sappir,梵语Sanipriga。同红宝石一样,蓝宝石也有许多传奇式的赞美传说。古波斯人相信,地球坐在一块鲜艳的蓝宝石上面,而天空就像一面镜子,把它的颜色映照出来。这种传说应当有所依据,从月球一看,地球确实是蓝色的,一个蔚蓝的星球,永远的蓝。

在中世纪,蓝宝石的神秘性不仅得到到了中世纪教皇和圣职者们的青睐,也受到王室与贵族的推崇。11世纪英国国王的戒指上就使唤用了一枚玫瑰色蓝宝石,这枚蓝宝石后来又被镶嵌到英国国王的王冠上。神学家认为蓝宝石圣眼疾有特殊疗效,根据当时的文献记载,当眼睛进入异物时,将蓝宝石浸到水里,再用水冲洗眼睛,就能够清除异物。

至少从12世纪起,蓝宝石就已被用作圣职者戒指,因为蓝宝石可以保护持有者免于邪恶的摧残。特别是当持有者遇到危险时,蓝宝石会变成白色,直到灾难过去才会恢复原色。 据说蓝宝石的光芒还可以杀死有毒的生物,但心术不正的人,是无法使蓝宝石发出光芒的。

十月诞生石——蛋白石(opal)

在西元前100年的罗曼史中,首次出现了蛋白石的神话纪录。由于独特的游彩现象,让蛋白石闪耀的色泽更加绚丽多变,成为欧美人眼中的浪漫表率。十九世纪末,蛋白石因维多利亚女王的喜爱而重见天日,其实,蛋白石是种很美的宝石,古人曾形容它有着如石榴般的火红,紫水晶般的亮丽高贵以及祖母绿般的海绿清新,三种不可思议的特质相聚,闪烁出令人难以置信的光芒。更象征着纯洁、希望和健康。

十一月诞生石——黄玉(topaz)

Topaz在希腊语中是"寻求"的意思,因为最初它产于红海上常年笼罩在浓雾中的多帕柔斯岛。为了采掘黄玉,人们必须花很大一番努力寻找。

传说,在黑暗的地方摩擦黄玉,会放出火焰般的光芒,因此人们相信它具有神秘的力量和驱魔的效果。在中世纪法国的奥尔良,有次在庆典中扮成圣母玛丽亚的少女茱莎,遇见一个扮成独角兽的年轻男子。两人一见钟情,但这位青年仍不肯把面具取下。茱莎害怕对方是恶魔化身,就跑到教堂求上帝指示。最后她把黄玉用金线穿起来带在左腕上,使受魔鬼诅咒化为独角兽的青年终于恢复人类的面目。所以黄玉的石语就是:希望、纯洁和挚爱。

十二月诞生石——绿松石(turquoise)

英文中的turquoise,来自“Turkey”,意为“土耳其玉”。古代欧洲及中东地区的人都相信它可以带来快乐与好运,也可以让佩戴者远离疾病。波斯人相信清晨第一眼看到绿松石能带来一天的好运气;埃及人用绿松石雕成爱神来护卫自己的宝石店;印第安人佩带绿松石饰物来避邪;西藏人则认为绿松石是佛的化身,具有不可抗拒的神力;土耳其人甚至确信绿松石念珠能挡住恶魔的眼光。更为有趣的是,中世纪德国青年男女订婚时,男子都要送未婚妻一枚绿松石戒指,若绿松石由蓝变绿,就认为未婚妻失去了贞洁,婚约将被解除。为了不致受骗,未婚妻要将绿松石戒指妥为保存。仅在未婚夫召见时才肯佩带。它的石语就是:温馨、吉祥与生命

12月好像是绿松石啊……