id int not null auto_increment,
foo varchar(100) not null,
bar text not null,
primary key (id)
) Type=MyISAM CHARACTER SET utf8;
q里创徏表类型时要用MyISAMcd,因ؓ只有MyISAMcd才支持完整的utf8.最后设|编码utf8.
1.dbi操作数据?br /> 如果你本地编码时gbk的话,首先要默认类Iconvq行转换.
require 'iconv'
def gb2u str
conv = Iconv.new("UTF-8", "GBK")
str = conv.iconv(str)
str << conv.iconv(nil)
conv.close
str
end
插入代码:
DBI.connect('DBI:Mysql:test:localhost', 'mysql', '') { |dbh|
dbh.execute 'SET NAMES utf8' #q里要指明代?br /> 1.upto(13) { |i|
st.execute("insert into samples(foo, bar) values('#{gb2u('一')}#{i}', '#{gb2u('?)}')")
}
}
2.activerecord
activerecord是对dbi的包?(也更?呵呵!)
代码:
require 'rubygems'
require_gem 'activerecord' #因ؓ我是gem的安?br />
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "localhost",
:database => "test",
:username => "mysql",
:password => "",
:encoding => "utf8") #~码只需q里指明
#指明?br /> class Mytab < ActiveRecord::Base
set_table_name 'samples'
end
#插入数据
tab = Mytab.new
tab.foo= gb2u('一')
tab.bar = gb2u('?)
tab.save
#查询数据
data = Mytab.find(:all)
data.each { |line|
puts "['#{line[:id]}', '#{line[:foo]}, '#{line[:bar]}]"
}
1。gem query --remote # shortcut: gem q -R
#列出所有包
2。gem query --remote --name-matches doom
# shortcut: gem q -R -n doom
#列出所有名字匹配的?br />3。gem install --remote progressbar
# shortcut: gem i -r progressbar
#安装指定名字的包?br />gem ins -r progressbar --version '> 0.0.1' #q里可以匚w版本
4。gem specification progressbar
# shortcut: gem spec progressbar
#查看安装q的指定包详l信?br />5?code>gem uninstall progressbar
#卸蝲?br />6。gem query --local
# shortcut: 'gem q -L'
#列出所有本地安装过的包
7?code>gem ins rake
#在本地安装,如果没有q程安装
8?code>gem list -b ^C
#列出所有以C开头的?br />9?code>gem_server
开启rdoc服务。可以查看安装包的rdoc
include
?code>extend有什么不同? ##include
负责?code>module插入到类(模块)中,q样p以函数的形式来调用方法;?code>extend负责?code>module插入到对?实例)中,q样添加了ҎҎ?br />def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0 ##对象变量
end
def to_s
"Song: #@name--#@artist (#@duration)"
end
def name ##函数式的公开所有变?br /> @name
end
def artist
@artist
end
def duration
@duration
end
def call_block
puts "Start of method"
yield ##执行传入的参?q里?In the block"
yield
puts "End of method"
end
call_block { puts "In the block" }
##############################################
"gin joint".length #所有都是以Object为root
"Rick".index("c")
-1942.abs
sam.play(song)
song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
# and so on
本质上来_一个闭包是一块代码,它们能作为参C递给一个方法调用。我通过一个简单的例子来阐q这个观炏V假设我们有一个包含一些雇员对象的列表Q然后我惛_位ؓl理的员工,q样的员工可以通过IsManager判断。在C#里,我们可能会写Z面类似的代码Q?/P>
public static IList Managers(IList emps) { IList result = new ArrayList(); foreach(Employee e in emps) if (e.IsManager) result.Add(e); return result; }
在一U支持闭包的语言中,比如RubyQ我们可以这样写Q?/P>
def managers(emps) return emps.select {|e| e.isManager} end
select是Ruby中定义的集合l构中的一个方法,它接受一个blockQ也是闭包Q作Z个参数。在Ruby中,闭包写在一对大括号中(不止q一U方法,另一Uؓdo .. endQ。如果这个块也接受参敎ͼ你可以将q些参数攑ֈ两个竖线之间。selectҎ循环q代l定的数l,Ҏ个元素执行给定的blockQ然后将每次执行blockq回true的元素组成一个新的数l再q回?/P>
现在Q如果你是CE序员你也许要想Q通过函数指针也可以实玎ͼ如果你是JAVAE序员,你可能回x可以用匿名内cL实现Q而一个C#者则会想C理(delegateQ。这些机制和闭包cMQ但是它们和闭包之间有两个明昑־区别?/P>
W一个是形式上的不同QThe first one is a formal differenceQ。闭包可以引用它定义时候可见的变量。看看下面的ҎQ?/P>
def highPaid(emps) threshold = 150 return emps.select {|e| e.salary > threshold} end
注意select的block代码中引用了在包含它的方法中的局部变量,而其它不支持真正闭包的语a使用其它Ҏ辑ֈcM功能的方法则不能q样做。闭包还允许你做更有的事情Q比如下面方法:
def paidMore(amount) return Proc.new {|e| e.salary > amount} end
q个Ҏq回一个闭包,实际上它q回一个依赖于传给它的参数的闭包。我可以用一个参数创Z个这LҎQ然后再把它赋给另一个变量?/P>
highPaid = paidMore(150)
变量 包含了一D代码(在Ruby中是一个Proc对象Q,q段代码判断一个对象的salary属性是否大?50。我们可以这样用这个方法:
john = Employee.new john.salary = 200 print highPaid.call(john)
表达?CODE>调用我之前定义的代码Q这时候此代码中的amount已经在创Ҏ的时候绑定ؓ150。即使现在我执行print 的时候,150已经不在它的范围内了Q但是amount?50之间的绑定依然存在?/P>
所以,闭包的第一个关键点是闭包是一D代码加上和定义它的环境之间的绑定(they are a block of code plus the bindings to the environment they came fromQ。这是闭包和函数指针{其它相似技术的不同点(java匿名内类可以讉K局部变量,但是只有当这些内cLfinal的时候才行)?/P>
W二个不同点不是定义形式的不同,但是也同样重要。(The second difference is less of a defined formal difference, but is just as important, if not more so in practiceQ。支持闭包的语言允许你用很少的语法去定义一个闭包,管q点可能不是很重要的一点,但我怿q点是至关重要的Q这是得h们能很自然的使用闭包的关键点。看看LispQSmalltalk和RubyQ闭包遍布各处-比其它语a中类似的使用多很多。绑定局部变量是它的特点之一Q但我想最大的原因是用闭包的语法和符号非常简单和清楚?/P>
一个很好的相关例子是从SmalltalkE序员到JAVAE序员,开始时很多人,包括我,试验性的在Smalltalk中用闭包的地方在Java中用匿名内cL实现。但l果使得代码变得混ؕ隄Q所以我们不得不攑ּ?/P>
我在Rubyl常使用闭包Q但我不打算创徏Proc对象Q然后传来传厅R大多数旉我用闭包来处理前面我提到的select{基于集合对象的Ҏ。闭包另一个重要用途是'execute around method'Q比如处理一个文Ӟ q里openҎ打开一个文Ӟ然后执行l定的blockQ然后关闭它。这样处理非常方便,其是对事务Q要求commit或者rollbackQ,或者其它的你需要在处理l束时候作一些收֤理的事情。我在我的xml文档转换中广泛用这个优炏V?/P>
闭包的这些用法显然远不如用Lisp语言的h遇到的多Q即使我Q在使用没有闭包支持的语a的时候,也会惛_q些东西。闭包就像一些你W一D到觉得不怎么L东西Q但你很快就会喜Ƣ上它们?/P>File.open(filename) {|f| doSomethingWithFile(f)}