- 浏览: 661074 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zhouyicang:
为嘛人气不够,这么好的文章,我找了几十篇博客,才找到这篇解惑了 ...
HTML 块级元素/内联元素 -
young7:
不错,解惑了
HTML 块级元素/内联元素 -
lvjin948:
获取浏览器语言的完美方案。http://blog.csdn.n ...
JavaScript获取浏览器语言类型 -
tarena_hhh:
我用了css优化工具,发现他的顺序有很大不一样?????
CSS属性书写顺序及命名规则 -
deng131:
谢谢你的提醒,是有个地方写错了
javascript事件绑定addEventListener,attachEvent
YAML
YAML Ain't Markup Language。
YAML是一个类似GNU的递归式定义。GNU对Unix说“No”,YMAL则是对XML说“No”。而在Ruby的世界里,YAML可以说是Ruby流动的血液。YAML 之于Ruby,犹如XML之于Java。
为什么要向XML说“No”呢?因为:
* YAML的可读性好。
* YAML和脚本语言的交互性好。
* YAML使用宿主语言的数据类型。
* YAML有一个一致的信息模型。
* YAML易于实现。
上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:
* YAML可以基于流来处理;
* YAML表达能力强,扩展性好。
总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
YAML示例
首先用一个在Rails开发中一定会遇到的YAML文件——database.yml——作为示例。在你创建一个Rails工程后,Rails会自动给你创建一个这样的文件,它的路径是config/database.yml:
# MySQL (default setup). Versions 4.1 and 5.0 are recommended.
# 此处省略一些注释。
development:
adapter: mysql
database: demo_development
username: root
password:
host: localhost
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: demo_test
username: root
password:
host: localhost
production:
adapter: mysql
database: demo_production
username: root
password:
host: localhost
似乎很直观,对么?除去注释,会发现有三个组,分别用development、test和production标识。这三个组每个又有adapter、database、username、password和host这些属性。作为一个聪明的程序员,你一定已经意识到空格在这里发挥了作用!
完全正确!空格(注意:Tab不是)在YAML中用来表示代码的结构。上面的YAML文件可以被解析为一个哈希对象,它有三个元素,当然,每个元素又是一个哈希对象,下面是使用YAML::load(File.read(“database.yml”)) 方法获得的对象描述(为了保护视力和大脑,我进行了一些排版):
{
'development'=> {'adapter' => 'mysql', 'database' => 'demo_development',
‘username’ => 'root', ‘password’ => nil, ‘host’ => 'localhost'},
‘test’=> {‘adapter’ => 'mysql', ‘database’ => 'demo_test',
‘username’ => 'root', ‘password’ => nil, ‘host’ => 'localhost'},
‘production’=> {‘adapter’ => 'mysql', ‘database’ => 'demo_production',
‘username’ => 'root', ‘password’ => nil, ‘host’ => 'localhost'}
}
有了这个,你几乎就已经明白了所有在Rails中能遇到的YAML文件了,Rails中用到的YAML文件几乎永远是这种格式。例如,Rails为每个模型都会生成一个供单元测试使用的夹具(Fixture)文件,也是使用这种格式。
不过,Rails还加入了另外的灵活性。在这些属性中还可以使用Ruby代码!当然,对于数据库配置来说,这似乎用处不大,但是对于单元测试,有时你可能希望某个日期属性是当前测试的日期,那么这个功能就特别有用了。
Rails是怎样做到这个的,其实很简单。它在调用YAML::load方法之前先进行了ERB的解析,把Ruby代码执行后的结果再交给YAML进行加载,就可以得到这个小魔术了。下面是Rails加载数据库配置文件的代码:
YAML::load(ERB.new(IO.read(database_configuration_file)).result)
尽管Rails一般总是这样使用YAML,YAML实际上还有其他的一些用法,我们将在下面进行一些介绍。
YAML语言元素
下面对YAML的语言元素做一个简要介绍:
1. 列表(List)
表示一个列表很简单,在每个条目前加入一个短横线。比如
- Item1
- Item2
- Item3
在Ruby中会被解释为数组对象(Array),上例为:
[“Item1”, “Item2”, “Item3”]
2. 哈希表(Hash)
我们在前面的例子中已经大量使用了哈希表对象。哈希表的键/值之间用冒号(:)进行分隔。
key1 : value1
key2 : value2
key3 : value3
在Ruby中会被解释为如下的哈希对象:
{"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"}
3. 字符串和其它基本类型
YAML会自动判断类型,一般性的文字都会被解释为字符串。在有可能发生歧义的情况下,可以为字符串加上单引号或者双引号(在双引号下转义字符会被转义,转义方式与C语言类似)来避免歧义。
下面是一个例子,包含了字符串、整数、浮点数和日期类型:
1 : 1.0
1.0 : "1.0"
"1.0" : 2006-01-01
它会被解释为:
{1=>1.0, "1.0"=>#<Date: 4907473/2,0,2299161>, 1.0=>"1.0"}
可以看出它的类型被很好的识别出来。
4. 字符串块
字符串可能会占据多行,可以用两种方式来处理这种情况,一种是保留换行符,另外一种则去除换行符。
用| 表示保留换行符:
|
This is line1.
This is line2.
This is line3.
它会被解释为:
"This is line1.\nThis is line2.\nThis is line3."
用>表示删除换行符:
>
Hello,
world.
会被解释为:
"Hello, world."
以上是一些常用的基本类型,当然它们还可以组合为更复杂的结构,比如列表的内容可以是列表本身,也可以是哈希表;哈希表的内容也可以是列表或哈希表,它们可以嵌套使用,来获得非常复杂的结构。
对于重复出现的项目,可以用&进行定义,然后用*进行引用。下面用一个比较完整的例子来说明这些内容(该例子取自http://en.wikipedia.org/wiki/YAML#Sample_Document)。
logEvent: Purchase Invoice
date: 2007-08-06
customer:
given: Dorothy
family: Gale
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Westville
state: KA
ship-to: *id001
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
price: 100.27
quantity: 1
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
它表示Ruby对象如下:
{
"items"=>[
{"price"=>1.47, "quantity"=>4, "part_no"=>"A4786", "descrip"=>"Water Bucket (Filled)"},
{"price"=>100.27, "quantity"=>1, "part_no"=>"E1628", "descrip"=>"High Heeled \"Ruby\" Slippers"}
],
"bill-to"=>{"city"=>"East Westville", "street"=>"123 Tornado Alley\nSuite 16\n", "state"=>"KA"},
"specialDelivery"=>"Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.",
"date"=>#<Date: 4908637/2,0,2299161>,
"ship-to"=>{"city"=>"East Westville", "street"=>"123 Tornado Alley\nSuite 16\n", "state"=>"KA"},
"customer"=>{"given"=>"Dorothy", "family"=>"Gale"},
"logEvent"=>"Purchase Invoice"
}
YAML和JSON
近来火热的JSON可以看作是(几乎是)YAML的一个子集,一般说来,YAML的解析器都可以解析JSON文档。关于JSON的说明可以参见JSON的主页(http://json.org/),这里甚至还提供了一个中文版本的文档(http://json.org/json-zh.html)。
YAML资源
· YAML主页:http://www.yaml.org/
· YAML维基百科:http://en.wikipedia.org/wiki/YAML
· Developerworks上的YAML简介:http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/index.html
YAML Ain't Markup Language。
YAML是一个类似GNU的递归式定义。GNU对Unix说“No”,YMAL则是对XML说“No”。而在Ruby的世界里,YAML可以说是Ruby流动的血液。YAML 之于Ruby,犹如XML之于Java。
为什么要向XML说“No”呢?因为:
* YAML的可读性好。
* YAML和脚本语言的交互性好。
* YAML使用宿主语言的数据类型。
* YAML有一个一致的信息模型。
* YAML易于实现。
上面5条也就是XML不足的地方。同时,YAML也有XML的下列优点:
* YAML可以基于流来处理;
* YAML表达能力强,扩展性好。
总之,YAML试图用一种比XML更敏捷的方式,来完成XML所完成的任务。
YAML示例
首先用一个在Rails开发中一定会遇到的YAML文件——database.yml——作为示例。在你创建一个Rails工程后,Rails会自动给你创建一个这样的文件,它的路径是config/database.yml:
# MySQL (default setup). Versions 4.1 and 5.0 are recommended.
# 此处省略一些注释。
development:
adapter: mysql
database: demo_development
username: root
password:
host: localhost
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: demo_test
username: root
password:
host: localhost
production:
adapter: mysql
database: demo_production
username: root
password:
host: localhost
似乎很直观,对么?除去注释,会发现有三个组,分别用development、test和production标识。这三个组每个又有adapter、database、username、password和host这些属性。作为一个聪明的程序员,你一定已经意识到空格在这里发挥了作用!
完全正确!空格(注意:Tab不是)在YAML中用来表示代码的结构。上面的YAML文件可以被解析为一个哈希对象,它有三个元素,当然,每个元素又是一个哈希对象,下面是使用YAML::load(File.read(“database.yml”)) 方法获得的对象描述(为了保护视力和大脑,我进行了一些排版):
{
'development'=> {'adapter' => 'mysql', 'database' => 'demo_development',
‘username’ => 'root', ‘password’ => nil, ‘host’ => 'localhost'},
‘test’=> {‘adapter’ => 'mysql', ‘database’ => 'demo_test',
‘username’ => 'root', ‘password’ => nil, ‘host’ => 'localhost'},
‘production’=> {‘adapter’ => 'mysql', ‘database’ => 'demo_production',
‘username’ => 'root', ‘password’ => nil, ‘host’ => 'localhost'}
}
有了这个,你几乎就已经明白了所有在Rails中能遇到的YAML文件了,Rails中用到的YAML文件几乎永远是这种格式。例如,Rails为每个模型都会生成一个供单元测试使用的夹具(Fixture)文件,也是使用这种格式。
不过,Rails还加入了另外的灵活性。在这些属性中还可以使用Ruby代码!当然,对于数据库配置来说,这似乎用处不大,但是对于单元测试,有时你可能希望某个日期属性是当前测试的日期,那么这个功能就特别有用了。
Rails是怎样做到这个的,其实很简单。它在调用YAML::load方法之前先进行了ERB的解析,把Ruby代码执行后的结果再交给YAML进行加载,就可以得到这个小魔术了。下面是Rails加载数据库配置文件的代码:
YAML::load(ERB.new(IO.read(database_configuration_file)).result)
尽管Rails一般总是这样使用YAML,YAML实际上还有其他的一些用法,我们将在下面进行一些介绍。
YAML语言元素
下面对YAML的语言元素做一个简要介绍:
1. 列表(List)
表示一个列表很简单,在每个条目前加入一个短横线。比如
- Item1
- Item2
- Item3
在Ruby中会被解释为数组对象(Array),上例为:
[“Item1”, “Item2”, “Item3”]
2. 哈希表(Hash)
我们在前面的例子中已经大量使用了哈希表对象。哈希表的键/值之间用冒号(:)进行分隔。
key1 : value1
key2 : value2
key3 : value3
在Ruby中会被解释为如下的哈希对象:
{"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"}
3. 字符串和其它基本类型
YAML会自动判断类型,一般性的文字都会被解释为字符串。在有可能发生歧义的情况下,可以为字符串加上单引号或者双引号(在双引号下转义字符会被转义,转义方式与C语言类似)来避免歧义。
下面是一个例子,包含了字符串、整数、浮点数和日期类型:
1 : 1.0
1.0 : "1.0"
"1.0" : 2006-01-01
它会被解释为:
{1=>1.0, "1.0"=>#<Date: 4907473/2,0,2299161>, 1.0=>"1.0"}
可以看出它的类型被很好的识别出来。
4. 字符串块
字符串可能会占据多行,可以用两种方式来处理这种情况,一种是保留换行符,另外一种则去除换行符。
用| 表示保留换行符:
|
This is line1.
This is line2.
This is line3.
它会被解释为:
"This is line1.\nThis is line2.\nThis is line3."
用>表示删除换行符:
>
Hello,
world.
会被解释为:
"Hello, world."
以上是一些常用的基本类型,当然它们还可以组合为更复杂的结构,比如列表的内容可以是列表本身,也可以是哈希表;哈希表的内容也可以是列表或哈希表,它们可以嵌套使用,来获得非常复杂的结构。
对于重复出现的项目,可以用&进行定义,然后用*进行引用。下面用一个比较完整的例子来说明这些内容(该例子取自http://en.wikipedia.org/wiki/YAML#Sample_Document)。
logEvent: Purchase Invoice
date: 2007-08-06
customer:
given: Dorothy
family: Gale
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Westville
state: KA
ship-to: *id001
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
price: 100.27
quantity: 1
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
它表示Ruby对象如下:
{
"items"=>[
{"price"=>1.47, "quantity"=>4, "part_no"=>"A4786", "descrip"=>"Water Bucket (Filled)"},
{"price"=>100.27, "quantity"=>1, "part_no"=>"E1628", "descrip"=>"High Heeled \"Ruby\" Slippers"}
],
"bill-to"=>{"city"=>"East Westville", "street"=>"123 Tornado Alley\nSuite 16\n", "state"=>"KA"},
"specialDelivery"=>"Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.",
"date"=>#<Date: 4908637/2,0,2299161>,
"ship-to"=>{"city"=>"East Westville", "street"=>"123 Tornado Alley\nSuite 16\n", "state"=>"KA"},
"customer"=>{"given"=>"Dorothy", "family"=>"Gale"},
"logEvent"=>"Purchase Invoice"
}
YAML和JSON
近来火热的JSON可以看作是(几乎是)YAML的一个子集,一般说来,YAML的解析器都可以解析JSON文档。关于JSON的说明可以参见JSON的主页(http://json.org/),这里甚至还提供了一个中文版本的文档(http://json.org/json-zh.html)。
YAML资源
· YAML主页:http://www.yaml.org/
· YAML维基百科:http://en.wikipedia.org/wiki/YAML
· Developerworks上的YAML简介:http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/index.html
发表评论
-
惯例优于配置原则
2010-07-21 10:42 1751惯例优于配置(Convention over Configur ... -
Ruby中AOP实现方法
2010-07-19 15:48 1074转自:http://blackanger.blog.51cto ... -
ruby中星号(*)作用
2010-07-19 11:50 10661,有正常的乘法功能 2*2 1*1 2,数组*intege ... -
字符,整数,字符串转换 pack,unpack
2010-07-19 11:45 1408字符串和整数的转换: ?a #显示a的ascii值 ... -
RPC与REST区别
2010-07-15 14:26 3445转自:http://georid.spaces.l ... -
Ruby 常用内部变量
2010-06-11 17:01 1088局部域:在某一个线程作用域内才能有效,下列也可看做是线程内的局 ... -
RFC、RPC区别及解释
2010-06-09 09:07 2760RFC是request for comment的缩写,是由IE ... -
Comet 技术两种实现
2010-06-08 23:55 5452转自 http://ququzone.blogbus. ... -
Web服务器和Applicaion服务器
2010-06-08 18:41 1169Web服务器传送(serves)页 ... -
Mongrel Application服务器
2010-06-08 18:36 945Mongrel是一种快速的针对Ruby的Http 服务器,专门 ... -
Nginx web服务器
2010-06-08 18:31 1071Nginx ("engine x") 是一 ... -
Web设计之REST架构风格
2010-06-07 21:16 1132REST架构风格是全新的针对Web应用的开发风格,是当今世界最 ... -
Ruby on Rails使用Haml
2009-12-10 18:56 163Haml是一种用来描述任何XHTML web document ... -
Rails render partial collection
2009-11-02 11:52 67ruby 1.8.7 + rails 2.1.0 Rails ... -
Rails Liquid邮件模板
2009-08-20 13:14 184允许用户自定义邮件模板样式 http://cjohansen. ... -
Rails类实列变量
2009-07-14 22:21 40D:\project\trunk\trunk>irb i ... -
Rails产品环境下Migration维护表
2009-07-13 17:01 48随着公司产品的上线,产品环境下就要求数据库表不能在重新执行ra ... -
FastCSV数据导出到csv文件
2009-06-03 13:17 267具体使用看Readme,下面介绍FastCSV在导出网站数据中 ... -
Rails开发系统添加WAP支持
2009-04-19 00:24 224Rails在WEB开发中独树一帜,取得相当大的成功,但是其内核 ... -
Rails迁移数据增加MYSQL函数Function
2009-04-10 13:15 78class CreateFunctions < Acti ...
相关推荐
它是使用 Ruby on Rails、Postgres SQL、Bootstrap、YAML、JQuery、Underscore.string、AJAX、OmniAuth、JST、EJS 开发的,并托管在 Heroku 上。 在观看现场演示并享受。 我们通过在带有示例的实时表上向您展示...
解析器](Online YAML Parser) 好文共分享 [Ruby 与多态](Polymorphism and Ruby) 书籍推荐 由于 ruby 和 rails 的版本迭代都很快,这就导致很多出版的 ruby 书籍过了几年都严重落伍,所以一定要看要买最新版的。 ...
守卫::Yamlsort Guard::Yamlsort 在检测到修改时按字母顺序对 yaml 文件中的键进行排序。要求Ruby。 Ruby 1.9.2 或更高版本。安装将 guard-yamlsort 添加到您的 Gemfile(在开发组内): gem ' guard-yamlsort ' ...
安装$ gem install codeland-starter用法设置$ codeland-starter install # Will create ~/codeland-starter.yml$ vi ~ /codeland-starter.yml YAML中的“ integrations部分是一系列服务。 例如: integrations : - ...
Untouched.co播种数据未触及包括自定义数据种子机制,该机制使用来指定开发数据... 您会注意到,在YAML规范中,它们中的每一个都表示为单独的列表。运行种子请注意,此时运行种子脚本是一种破坏性的操作,将破坏所有现
Ruby on Rails的客户端 添加此gem可以本地化Ruby on Rails应用程序。 使用正式的Rails语法(带有文件)或使用语法。 只写源文本,并与Translator.io上的保持同步。 (2.5分钟) 需要帮忙? 目录 翻译语法 I18n...
该项目移至
Ruby on Rails教程构建了一个Rails应用程序 这是使用以下材料构建的应用程序的存储库: 执照 [Ruby on Rails turorial]更多详细信息,请参见( )。该代码在MIT许可证和Beerware下发布。更多详细信息,请参见 用法 ...
良好的可视化:Prometheus除了自带有Prometheus UI,Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。另外最新的Grafana可视化工具也提供了完整的Proetheus支持,基于Prometheus提供的...
appmap_swagger 此gem提供了一个名为swagger的... 为Ruby和Ruby on Rails应用一些合理的默认值。 将两个文件输出到指定目录(默认: swagger ): openapi.yaml Full Swagger,包括文档和示例。 openapi_stable.y
WebFaction 私有应用程序栈shell 脚本webfaction.sh将自动构建和配置您自己的私有Ruby on Rails堆栈。 它是为用户编写的,但相当通用。 假定目录$HOME/logs/user和$HOME/webapps/$APP_NAME存在。提供什么混帐sqlite ...
第 19 章: Ruby on Rails 第 20 章:动态规划 Ruby 以易于学习而闻名,但大多数用户只触及了它可以做的事情的皮毛。 其他书籍侧重于 Ruby 的时尚特性,而 The Book of Ruby揭示了世界上最流行的编程语言之一的...
正在安装这是Ruby on Rails应用程序。 它只有几个要求: Ruby 1.9.3 PostgreSQL(由pg支持的全文搜索) pygments(用于语法突出显示) Ruby邦德勒克隆仓库 git clone git://github....
Montrose是一个易于使用的库,用于在Ruby中定义重复事件。 它受的设计原理和可用的规则定义的启发,使用简单的链接系统来构建重复。 安装 将此行添加到您的应用程序的Gemfile中: gem "montrose" 然后执行: $ ...