聽聽聽聽id int not null auto_increment,
聽聽聽聽foo varchar(100) not null,
聽聽聽聽bar text not null,
聽聽聽聽primary key (id)
) Type=MyISAM CHARACTER SET utf8;
榪欓噷鍒涘緩琛ㄧ被鍨嬫椂瑕佷嬌鐢∕yISAM綾誨瀷,鍥犱負鍙湁MyISAM綾誨瀷鎵嶆敮鎸佸畬鏁寸殑utf8.鏈鍚庤緗紪鐮乽tf8.
1.dbi鎿嶄綔鏁版嵁搴?br /> 濡傛灉浣犳湰鍦扮紪鐮佹椂gbk鐨勮瘽,棣栧厛瑕侀粯璁ょ被Iconv榪涜杞崲.
require 'iconv'
def gb2u str
conv = Iconv.new("UTF-8", "GBK")
str = conv.iconv(str)
str << conv.iconv(nil)
conv.close
str
end
鎻掑叆浠g爜:
DBI.connect('DBI:Mysql:test:localhost', 'mysql', '') { |dbh|
dbh.execute 'SET NAMES utf8' #榪欓噷瑕佹寚鏄庝唬鐮?br /> 1.upto(13) { |i|
st.execute("insert into samples(foo, bar) values('#{gb2u('涓')}#{i}', '#{gb2u('浜?)}')")
}
}
2.activerecord
activerecord鏄dbi鐨勫寘瑁?(涔熸洿紲?鍛靛懙!)
浠g爜:
require 'rubygems'
require_gem 'activerecord' #鍥犱負鎴戞槸gem鐨勫畨瑁?br />
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:host => "localhost",
:database => "test",
:username => "mysql",
:password => "",
:encoding => "utf8") #緙栫爜鍙渶榪欓噷鎸囨槑
#鎸囨槑琛?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銆俫em query --remote # shortcut: gem q -R
#鍒楀嚭鎵鏈夊寘
2銆俫em query --remote --name-matches doom
# shortcut: gem q -R -n doom
#鍒楀嚭鎵鏈夊悕瀛楀尮閰嶇殑鍖?br />3銆俫em install --remote progressbar
# shortcut: gem i -r progressbar
#瀹夎鎸囧畾鍚嶅瓧鐨勫寘銆?br />gem ins -r progressbar --version '> 0.0.1' #榪欓噷鍙互鍖歸厤鐗堟湰
4銆俫em specification progressbar
# shortcut: gem spec progressbar
#鏌ョ湅瀹夎榪囩殑鎸囧畾鍖呰緇嗕俊鎭?br />5銆?code>gem uninstall progressbar
#鍗歌澆鍖?br />6銆俫em query --local
# shortcut: 'gem q -L'
#鍒楀嚭鎵鏈夋湰鍦板畨瑁呰繃鐨勫寘
7銆?code>gem ins rake
#鍦ㄦ湰鍦板畨瑁咃紝濡傛灉娌℃湁榪滅▼瀹夎
8銆?code>gem list -b ^C
#鍒楀嚭鎵鏈変互C寮澶寸殑鍖?br />9銆?code>gem_server
寮鍚痳doc鏈嶅姟銆傚彲浠ユ煡鐪嬪畨瑁呭寘鐨剅doc
include
鍜?code>extend鏈変粈涔堜笉鍚岋紵聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽聽 ##include
璐熻矗灝?code>module鎻掑叆鍒扮被(妯″潡)涓紝榪欐牱灝辮兘浠ュ嚱鏁扮殑褰㈠紡鏉ヨ皟鐢ㄦ柟娉曪紱鑰?code>extend璐熻矗灝?code>module鎻掑叆鍒板璞?瀹炰緥)涓紝榪欐牱灝辨坊鍔犱簡鐗規畩鏂規硶銆?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 ##鎵ц浼犲叆鐨勫弬鏁?榪欓噷涓?In the block"
yield
puts "End of method"
end
call_block { puts "In the block" }
##############################################
"gin joint".length #鎵鏈夐兘鏄互Object涓簉oot
"Rick".index("c")
-1942.abs
sam.play(song)
song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
# and so on
鏈川涓婃潵璇達紝涓涓棴鍖呮槸涓鍧椾唬鐮侊紝瀹冧滑鑳戒綔涓哄弬鏁頒紶閫掔粰涓涓柟娉曡皟鐢ㄣ傛垜灝嗛氳繃涓涓畝鍗曠殑渚嬪瓙鏉ラ槓榪拌繖涓鐐廣傚亣璁炬垜浠湁涓涓寘鍚竴浜涢泧鍛樺璞$殑鍒楄〃錛岀劧鍚庢垜鎯沖垪鍑鴻亴浣嶄負緇忕悊鐨勫憳宸ワ紝榪欐牱鐨勫憳宸ュ彲浠ラ氳繃IsManager鍒ゆ柇銆傚湪C#閲岋紝鎴戜滑鍙兘浼氬啓鍑轟笅闈㈢被浼肩殑浠g爜錛?/P>
public static IList Managers(IList emps) { IList result = new ArrayList(); foreach(Employee e in emps) if (e.IsManager) result.Add(e); return result; }
鍦ㄤ竴縐嶆敮鎸侀棴鍖呯殑璇█涓紝姣斿Ruby錛屾垜浠彲浠ヨ繖鏍峰啓錛?/P>
def managers(emps) return emps.select {|e| e.isManager} end
select鏄疪uby涓畾涔夌殑闆嗗悎緇撴瀯涓殑涓涓柟娉曪紝瀹冩帴鍙椾竴涓猙lock錛屼篃灝辨槸闂寘錛屼綔涓轟竴涓弬鏁般傚湪Ruby涓紝闂寘鍐欏湪涓瀵瑰ぇ鎷彿涓紙涓嶆榪欎竴縐嶆柟娉曪紝鍙︿竴縐嶄負do .. end錛夈傚鏋滆繖涓潡涔熸帴鍙楀弬鏁幫紝浣犲彲浠ュ皢榪欎簺鍙傛暟鏀懼埌涓や釜绔栫嚎涔嬮棿銆俿elect鏂規硶寰幆榪唬緇欏畾鐨勬暟緇勶紝瀵規瘡涓厓绱犳墽琛岀粰瀹氱殑block錛岀劧鍚庡皢姣忔鎵цblock榪斿洖true鐨勫厓绱犵粍鎴愪竴涓柊鐨勬暟緇勫啀榪斿洖銆?/P>
鐜板湪錛屽鏋滀綘鏄疌紼嬪簭鍛樹綘涔熻瑕佹兂錛岄氳繃鍑芥暟鎸囬拡涔熷彲浠ュ疄鐜幫紝濡傛灉浣犳槸JAVA紼嬪簭鍛橈紝浣犲彲鑳藉洖鎯蟲垜鍙互鐢ㄥ尶鍚嶅唴綾繪潵瀹炵幇錛岃屼竴涓狢#鑰呭垯浼氭兂鍒頒唬鐞嗭紙delegate錛夈傝繖浜涙満鍒跺拰闂寘綾諱技錛屼絾鏄畠浠拰闂寘涔嬮棿鏈変袱涓槑鏄懼緱鍖哄埆銆?/P>
絎竴涓槸褰㈠紡涓婄殑涓嶅悓錛圱he first one is a formal difference錛夈傞棴鍖呭彲浠ュ紩鐢ㄥ畠瀹氫箟鏃跺欏彲瑙佺殑鍙橀噺銆傜湅鐪嬩笅闈㈢殑鏂規硶錛?/P>
def highPaid(emps) threshold = 150 return emps.select {|e| e.salary > threshold} end
娉ㄦ剰select鐨刡lock浠g爜涓紩鐢ㄤ簡鍦ㄥ寘鍚畠鐨勬柟娉曚腑鐨勫眬閮ㄥ彉閲忥紝鑰屽叾瀹冧笉鏀寔鐪熸闂寘鐨勮璦浣跨敤鍏跺畠鏂規硶杈懼埌綾諱技鍔熻兘鐨勬柟娉曞垯涓嶈兘榪欐牱鍋氥傞棴鍖呰繕鍏佽浣犲仛鏇存湁瓚g殑浜嬫儏錛屾瘮濡備笅闈㈡柟娉曪細
def paidMore(amount) return Proc.new {|e| e.salary > amount} end
榪欎釜鏂規硶榪斿洖涓涓棴鍖咃紝瀹為檯涓婂畠榪斿洖涓涓緷璧栦簬浼犵粰瀹冪殑鍙傛暟鐨勯棴鍖呫傛垜鍙互鐢ㄤ竴涓弬鏁板垱寤轟竴涓繖鏍風殑鏂規硶錛岀劧鍚庡啀鎶婂畠璧嬬粰鍙︿竴涓彉閲忋?/P>
highPaid = paidMore(150)
鍙橀噺 鍖呭惈浜嗕竴孌典唬鐮侊紙鍦≧uby涓槸涓涓狿roc瀵硅薄錛夛紝榪欐浠g爜灝嗗垽鏂竴涓璞$殑salary灞炴ф槸鍚﹀ぇ浜?50銆傛垜浠彲浠ヨ繖鏍蜂嬌鐢ㄨ繖涓柟娉曪細
john = Employee.new john.salary = 200 print highPaid.call(john)
琛ㄨ揪寮?CODE>璋冪敤鎴戜箣鍓嶅畾涔夌殑浠g爜錛岃繖鏃跺欐浠g爜涓殑amount宸茬粡鍦ㄥ垱寤鴻繖鏂規硶鐨勬椂鍊欑粦瀹氫負150銆傚嵆浣跨幇鍦ㄦ垜鎵цprint 鐨勬椂鍊欙紝150宸茬粡涓嶅湪瀹冪殑鑼冨洿鍐呬簡錛屼絾鏄痑mount鍜?50涔嬮棿鐨勭粦瀹氫緷鐒跺瓨鍦ㄣ?/P>
鎵浠ワ紝闂寘鐨勭涓涓叧閿偣鏄棴鍖呮槸涓孌典唬鐮佸姞涓婂拰瀹氫箟瀹冪殑鐜涔嬮棿鐨勭粦瀹氾紙they are a block of code plus the bindings to the environment they came from錛夈傝繖鏄棴鍖呭拰鍑芥暟鎸囬拡絳夊叾瀹冪浉浼兼妧鏈殑涓嶅悓鐐癸紙java鍖垮悕鍐呯被鍙互璁塊棶灞閮ㄥ彉閲忥紝浣嗘槸鍙湁褰撹繖浜涘唴綾繪槸final鐨勬椂鍊欐墠琛岋級銆?/P>
絎簩涓笉鍚岀偣涓嶆槸瀹氫箟褰㈠紡鐨勪笉鍚岋紝浣嗘槸涔熷悓鏍烽噸瑕併傦紙The second difference is less of a defined formal difference, but is just as important, if not more so in practice錛夈傛敮鎸侀棴鍖呯殑璇█鍏佽浣犵敤寰堝皯鐨勮娉曞幓瀹氫箟涓涓棴鍖咃紝灝界榪欑偣鍙兘涓嶆槸寰堥噸瑕佺殑涓鐐癸紝浣嗘垜鐩鎬俊榪欑偣鏄嚦鍏抽噸瑕佺殑錛嶈繖鏄嬌寰椾漢浠兘寰堣嚜鐒剁殑浣跨敤闂寘鐨勫叧閿偣銆傜湅鐪婰isp錛孲malltalk鍜孯uby錛岄棴鍖呴亶甯冨悇澶勶紞姣斿叾瀹冭璦涓被浼肩殑浣跨敤澶氬緢澶氥傜粦瀹氬眬閮ㄥ彉閲忔槸瀹冪殑鐗圭偣涔嬩竴錛屼絾鎴戞兂鏈澶х殑鍘熷洜鏄嬌鐢ㄩ棴鍖呯殑璇硶鍜岀鍙烽潪甯哥畝鍗曞拰娓呮銆?/P>
涓涓緢濂界殑鐩稿叧渚嬪瓙鏄粠Smalltalk紼嬪簭鍛樺埌JAVA紼嬪簭鍛橈紝寮濮嬫椂寰堝浜猴紝鍖呮嫭鎴戯紝璇曢獙鎬х殑灝嗗湪Smalltalk涓嬌鐢ㄩ棴鍖呯殑鍦版柟鍦↗ava涓嬌鐢ㄥ尶鍚嶅唴綾繪潵瀹炵幇銆備絾緇撴灉浣垮緱浠g爜鍙樺緱娣蜂貢闅劇湅錛屾墍浠ユ垜浠笉寰椾笉鏀懼純銆?/P>
鎴戝湪Ruby緇忓父浣跨敤闂寘錛屼絾鎴戜笉鎵撶畻鍒涘緩Proc瀵硅薄錛岀劧鍚庝紶鏉ヤ紶鍘匯傚ぇ澶氭暟鏃墮棿鎴戠敤闂寘鏉ュ鐞嗗墠闈㈡垜鎻愬埌鐨剆elect絳夊熀浜庨泦鍚堝璞$殑鏂規硶銆傞棴鍖呭彟涓涓噸瑕佺敤閫旀槸'execute around method'錛屾瘮濡傚鐞嗕竴涓枃浠訛細 榪欓噷open鏂規硶鎵撳紑涓涓枃浠訛紝鐒跺悗鎵ц緇欏畾鐨刡lock錛岀劧鍚庡叧闂畠銆傝繖鏍峰鐞嗛潪甯告柟渚匡紝灝ゅ叾鏄浜嬪姟錛堣姹俢ommit鎴栬卹ollback錛夛紝鎴栬呭叾瀹冪殑浣犻渶瑕佸湪澶勭悊緇撴潫鏃跺欎綔涓浜涙敹灝懼鐞嗙殑浜嬫儏銆傛垜鍦ㄦ垜鐨剎ml鏂囨。杞崲涓箍娉涗嬌鐢ㄨ繖涓紭鐐廣?/P>
闂寘鐨勮繖浜涚敤娉曟樉鐒惰繙涓嶅鐢↙isp璇█鐨勪漢閬囧埌鐨勫錛屽嵆浣挎垜錛屽湪浣跨敤娌℃湁闂寘鏀寔鐨勮璦鐨勬椂鍊欙紝涔熶細鎯沖康榪欎簺涓滆タ銆傞棴鍖呭氨鍍忎竴浜涗綘絎竴鐪艱鍒拌寰椾笉鎬庝箞鏍風殑涓滆タ錛屼絾浣犲緢蹇氨浼氬枩嬈笂瀹冧滑銆?/P>File.open(filename) {|f| doSomethingWithFile(f)}