锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 璁㏄ython鏀寔true closure鏈夊闅撅紵 濡傛灉浣犱笉鐭ラ亾浠涔堟槸true closure錛岃繖閲岀畝鍗曡В閲婁竴涓嬨侾ython鏀寔lexicalscope錛?/p>
>>> def add_n(n): f寮曠敤浜嗗灞傚嚱鏁癮dd_n鐨勫眬閮ㄥ彉閲弉銆傛湁瓚g殑鏄紝f寮曠敤n鐨勬椂鍊欙紝add_n宸茬粡緇撴潫錛宯浼間箮涓嶅瓨鍦ㄤ簡銆俧鎵浠ヨ兘姝e父宸ヤ綔錛屾槸鍥犱負鍒涘緩瀹冪殑鏃跺欏氨鎶妌浣滀負f鐨勪笂涓嬫枃(closure)淇濆瓨浜嗕笅鏉ワ紝騫朵笉闅廰dd_n緇撴潫鑰屾秷澶便?br />
浣嗘槸錛孭ython鐨刲exical scope鍜孲cheme/Smalltalk/Ruby榪樻湁涓鐐瑰尯鍒細涓嶈兘鍦ㄥ唴灞傚嚱鏁頒腑rebind澶栧眰鍑芥暟鐨勫眬閮ㄥ彉閲忋?br />
>>> def f(): 榪欐槸鍥犱負Python娌℃湁鍙橀噺澹版槑錛?n=1 鑷姩浣縩鎴愪負g鐨勫眬閮ㄥ彉閲忥紝涔熷氨鏃犳硶rebind f涓殑n浜嗐傚彲浠ヨPython鐨刢losure鏄彧璇葷殑銆傚鏋滀綘鍚埌鏈変漢璇?Python涓嶆敮鎸乼rue closure"錛屽氨鏄寚榪欎釜銆傚叾瀹烇紝Python VM鑳藉鏀寔true closure銆傚洜涓猴紝Python鏀寔鍐呭眰鍑芥暟鐪嬭澶栧眰鍑芥暟鐨刵ame rebinding: >>> def f(): 瀵逛簬Python鐨刢losure瀹炵幇(flat closure)錛?澶栧眰鍑芥暟rebind name"鍜?鍐呭眰鍑芥暟rebind name"鍏跺疄娌℃湁鍖哄埆銆傛垜浠煡閬撶敤global鍏抽敭瀛楀彲浠ebind module scopename銆傚鏋滃鍔犱竴涓被浼肩殑outer鍏抽敭瀛楋紝灝卞彲浠ユ敮鎸乺ebind outer scope name銆傜湡姝g殑闄愬埗鏄疓uido涓嶆効鎰忎負鏀寔true closure澧炲姞鍏抽敭瀛椼?/p>
涔熷彲浠ヤ笉澧炲姞鍏抽敭瀛楋紝鑰屾槸鎶奼lobal n鐨勮涔夋敼涓?濡傛灉outer scope瀹氫箟浜唍錛宺ebind outer scope n錛涘惁鍒檙ebind module scope n"銆傜畝鍗曡搗瑙侊紝鎴戞病鏈変慨鏀筆ython鐨刡uilt-in compiler錛岃屾槸淇敼浜哻ompiler module(鐢≒ython瀹炵幇鐨凱ython compiler)銆備綘鍙渶鎶婁笅闈㈣繖涓猵atch鎵撳埌compiler/symbols.py(Python 2.5.1)灝卞彲浠ヤ綋楠宼rue closure浜嗭細 C:\Python\Lib>diff -u compiler/symbols.py.orig compiler/symbols.py def add_param(self, name): 鍥犱負鎴戜滑娌℃湁淇敼built-in compiler錛屾墍浠ョ▼搴忚鍐欏湪瀛楃涓查噷錛岀敤compiler.compile緙栬瘧錛岀敤exec鎵ц錛?br />
>>> from compiler import compile 鍚庤 1 鎼炶繖涓笢瑗跨殑緙樿搗鏄疭elfless Python(http://www.voidspace.org.uk/python/weblog/arch_d7_2006_12_16.shtml#e583)銆傚緢鏈夎叮鐨刡ytecode hack錛岀粰涓涓被涓殑鎵鏈夊嚱鏁拌ˉ涓妔elf鍙傛暟銆傛棦鐒禤ythonVM鏀寔true closure錛岃兘涓嶈兘鐢ㄧ被浼肩殑鎵嬫硶璁㏄ython鏀寔true closure鍛紵涓嶈繃寰堝揩灝辨槑鐧借繖涓湪bytecode灞傞潰涓嶅ソ寮勶紝榪樻槸寰椾慨鏀圭紪璇戝櫒銆備笉榪囨敼璧鋒潵榪樼湡鏄嚭涔庢剰鏂欏湴綆鍗曘?/p>
2 Guido鏃╁凡鏄庣‘琛ㄧず涓嶈兘鏀瑰彉global鐨勮涔夛紙鍥犱負浼氬獎鍝嶇幇鏈変唬鐮侊級錛屾墍浠ヨ繖涓彧鏄帺鐜╄屽凡錛屼笉鐢ㄦ寚鏈涙垚涓虹幇瀹炪傚綋鐒朵綘鍙互鍙彂甯僢ytecode錛屽ぇ姒傝繕鑳芥妸鍙嶇紪璇戝櫒鎼炴寕鎺夈?-) 鍙堬細寰堟姳姝?騫曞悗鐨勬晠浜?鎷栦簡榪欎箞涔呫傚啓璧鋒潵鎵嶅彂鐜拌嚜宸辮繕鏄笉鎳俤escriptor銆?br />
涓嶈繃鎴戣偗瀹氫笉浼氳瀹冪儌灝劇殑銆?/p>
姘存湪涓婄殑rmrf鍐欎簡涓涓悓姝IM Calender鍜孏oogle Calender鐨勮剼鏈?http://code.google.com/p/diaryvgc/downloads/list)
鎯沖埌blogger.com鏀寔閫氳繃鍙戦侀偖浠跺彂甯冩棩蹇楋紝浜庢槸鎴戜篃鍐欎簡涓妸VIM Calender涓殑鏃ヨ鍙戝竷鍒癰logger.com鐨勮剼鏈?br />
榪欎釜鑴氭湰鎶婂彂甯冩儏鍐佃褰曞湪diary/poster.log涓紝浠ュ悗姣忔鎵ц鍙細鍙戝竷鏈鏂扮殑鏃ュ織錛屽悓鏃惰冭檻鍒板綋澶╃殑鏃ヨ鍙兘浼氳淇敼錛坆logger.com浼間箮涓嶆敮鎸侀氳繃email淇敼鏃ュ織錛夛紝鎵浠ュ綋澶╃殑鏃ヨ涓嶄細琚彂甯冦?br />
浣跨敤鐨勬椂鍊欎慨鏀瑰紑澶村嚑琛岀殑閰嶇疆淇℃伅鍗沖彲#!/usr/bin/python
#聽A聽script聽for聽posting聽diaries聽created聽by聽VIM聽Calender聽to聽blogger.com
#聽Author:聽Wang聽Yuanxuan聽<zellux@gmail.com>
import聽smtplib,聽os,聽re,聽datetime
from聽email.mime.text聽import聽MIMEText
fromaddr聽=聽xxxxx@fudan.edu.cn'
toaddr聽=聽xxxx.xxxx@blogger.com'
smtpserver聽=聽'mail.fudan.edu.cn'
diarydir聽=聽'/home/user_name/diary'
username聽=聽'xxxxxx'
password聽=聽'xxxxxx'
logpath聽=聽diarydir聽+聽'/poster.log'
def聽PostMail(title,聽content):
聽聽聽聽msg聽=聽MIMEText(content聽+聽'\r\n#end\r\n')
聽聽聽聽msg['Subject']聽=聽title
聽聽聽聽msg['From']聽=聽fromaddr
聽聽聽聽msg['To']聽=聽toaddr
聽聽聽聽server聽=聽smtplib.SMTP(smtpserver)
聽聽聽聽server.login(username,聽password)
聽聽聽聽#聽server.set_debuglevel(1)
聽聽聽聽server.sendmail(fromaddr,聽[toaddr],聽msg.as_string())
聽聽聽聽server.quit()
#聽Load聽log聽file.聽Create聽a聽new聽one聽if聽not聽exist.
posted聽=聽[]
if聽os.path.isfile(logpath):
聽聽聽聽temp聽=聽open(logpath,聽'r')
聽聽聽聽posted聽=聽[line[:-1]聽for聽line聽in聽temp.readlines()]
聽聽聽聽log聽=聽open(logpath,聽'a')
else:
聽聽聽聽print聽"A聽new聽poster聽log聽has聽been聽created聽at聽"聽+聽logpath
聽聽聽聽log聽=聽open(logpath,聽'w')
pattern聽=聽r'(\d{4})/(\d{1,2})/(\d{1,2}).cal$'
scanner聽=聽re.compile(pattern)
for聽(top,聽dirname,聽filenames)聽in聽os.walk(diarydir):
聽聽聽聽for聽filename聽in聽filenames:
聽聽聽聽聽聽聽聽fullpath聽=聽os.path.join(top,聽filename)
聽聽聽聽聽聽聽聽if聽scanner.search(fullpath):
聽聽聽聽聽聽聽聽聽聽聽聽(year,聽month,聽day)聽=聽scanner.search(fullpath).groups()
聽聽聽聽聽聽聽聽聽聽聽聽filedate聽=聽datetime.date(int(year),聽int(month),聽int(day))
聽聽聽聽聽聽聽聽聽聽聽聽title聽=聽filedate.isoformat()
聽聽聽聽聽聽聽聽聽聽聽聽if聽filedate聽==聽datetime.date.today():
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽continue
聽聽聽聽聽聽聽聽聽聽聽聽if聽fullpath聽not聽in聽posted:
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽log.write(fullpath聽+聽'\n')
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽text聽=聽open(fullpath).read()
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽PostMail(title,聽text)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽print聽'The聽diary聽'聽+聽title聽+聽'聽has聽been聽posted'
log.close()
]]>
by ilovecpp
鍙渶淇敼11琛屼唬鐮併?/p>
... def f(m):
... return n+m
... return f
>>> add_2 = add_n(2)
>>> add_2(0)
2
>>> add_2(2)
4
... def g():
... n=1
... n=0
... g()
... return n
...
>>> f()
0
... def g():
... yield n
... yield n
... x = g()
... n = 0
... print x.next()
... n = 1
... print x.next()
...
>>> f()
0
1
--- compiler/symbols.py.orig Thu Aug 17 10:28:56 2006
+++ compiler/symbols.py Mon Feb 11 12:03:01 2008
@@ -21,6 +21,7 @@
self.params = {}
self.frees = {}
self.cells = {}
+ self.outers = {}
self.children = []
# nested is true if the class could contain free variables,
# i.e. if it is nested within another function.
@@ -54,8 +55,10 @@
if self.params.has_key(name):
raise SyntaxError, "%s in %s is global and parameter" % \
(name, self.name)
- self.globals[name] = 1
- self.module.add_def(name)
+ if self.nested:
+ self.outers[name] = 1
+ else:
+ self.globals[name] = 1
name = self.mangle(name)
@@ -90,6 +93,8 @@
"""
if self.globals.has_key(name):
return SC_GLOBAL
+ if self.outers.has_key(name):
+ return SC_FREE
if self.cells.has_key(name):
return SC_CELL
if self.defs.has_key(name):
@@ -107,6 +112,7 @@
return ()
free = {}
free.update(self.frees)
+ free.update(self.outers)
for name in self.uses.keys():
if not (self.defs.has_key(name) or
self.globals.has_key(name)):
@@ -134,6 +140,9 @@
free.
"""
self.globals[name] = 1
+ if self.outers.has_key(name):
+ self.module.add_def(name)
+ del self.outers[name]
if self.frees.has_key(name):
del self.frees[name]
for child in self.children:
>>> s = '''
... def counter():
... n = 0
... def inc():
... global n
... n += 1
... def dec():
... global n
... n -= 1
... def get():
... return n
... return inc, dec, get
... '''
>>> exec compile(s, '', 'exec')
>>> inc, dec, get = counter()
>>> get()
0
>>> inc()
>>> get()
1
>>> dec()
>>> get()
0
3 鎴戝彲浠ョ悊瑙uido鐨勫喅瀹氥傞櫎闈炰綘涔嬪墠涓鐩村湪鐢⊿cheme錛屽惁鍒欐垜瑙夊緱鍍忎笂闈ounter渚嬪瓙閭g涓緇勫叡浜姸鎬佺殑鍑芥暟榪樻槸鍐欐垚class涓哄ソ錛岃嚦灝戝叡浜姸鎬佹槸浠涔堜竴鐩簡鐒躲侺exical scope澶猧mplicit錛岀敤鍦ㄥ紑澶碼dd_n閭g鍦版柟鎸烘柟渚匡紝鍐嶅鏉傚氨涓嶅ソ浜嗐?/p>
]]>
for i, obj in enumerate(list):
print i, obj
Help on class enumerate in module __builtin__:
class enumerate(object)
| enumerate(iterable) -> iterator for index, value of iterable
|
| Return an enumerate object. iterable must be an other object that supports
| iteration. The enumerate object yields pairs containing a count (from
| zero) and a value yielded by the iterable argument. enumerate is useful
| for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ...
|
| Methods defined here:
|
| __getattribute__(...)
| x.__getattribute__('name') <==> x.name
|
| __iter__(...)
| x.__iter__() <==> iter(x)
|
| next(...)
| x.next() -> the next value, or raise StopIteration
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| __new__ = <built-in method __new__ of type object at 0xb7f35d20>
| T.__new__(S, ...) -> a new object with type S, a subtype of T
Help on built-in function sorted in module __builtin__:
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
2. walk()鍑芥暟
寰堝ソ鐢ㄧ殑涓涓嚱鏁?br>os.path.walk(rootdir, f, arg)
rootdir鏄璁塊棶鐨勭洰褰曟爲鐨勬牴錛宖鏄敤鎴峰畾涔夌殑鍑芥暟錛宎rg鏄皟鐢╢鏃剁敤鐨勪竴涓弬鏁般?br>瀵逛簬姣忎竴涓?walk"榪囩▼涓亣鍒扮殑鐩綍directory錛岃璇ョ洰褰曚笅鐨勬枃浠跺垪琛ㄤ負filelist錛寃alk鍑芥暟浼氳皟鐢?br>f(arg, directory, filelist)
鍑芥暟寮忕紪紼嬬浉鍏?/strong>
1. Mapping
map() 鏂規硶瀵瑰簭鍒椾腑鐨勬瘡涓厓绱犺皟鐢ㄦ煇涓嚱鏁幫紝榪斿洖鏂扮敓鎴愮殑緇撴灉搴忓垪銆?br>鏈夌偣綾諱技浜嶳uby鐨凙rray.each do | element |
>>> z = map(len, ["abc", "clounds", "rain"])
>>> z
[3, 6, 4]
2. Filtering
榪囨護鎺夋弧瓚蟲潯浠剁殑鍏冪礌錛岀被浼間笌Array.reject do | element |
>>> x = [5,12,-2,13]
>>> y = filter(lambda z: z > 0, x)
>>> y
[5, 12, 13]
3. List Comprehension
鏉ヤ釜澶嶆潅鐨勪緥瀛?br>>>> y
[[0, 2, 22], [1, 5, 12], [2, 3, 33]]
>>> [a for b in y for a in b[1:]]
[2, 22, 5, 12, 3, 33]
4. Reduction
鍏堢湅紺轟緥
>>> x = reduce(lambda x,y: x+y, range(5))
>>> x
10
鎵ц鐨勯『搴忔槸錛氶鍏堣皟鐢ㄥ嚱鏁板鐞唕ange(5)鍓嶄袱涓鹼紝0 + 1 = 1錛岀劧鍚庤繑鍥炵殑鍊?浣滀負x錛岀戶緇笌range(5)鐨勭涓変釜鍊?2錛屼綔涓簓)銆?br>鏈鍚庣殑緇撴灉鏄?+1+2+3+4鐨勫?br>榪欎釜甯哥敤鏉ヤ唬鏇縡or寰幆
灝辮鍙栦簡text鍙橀噺鐨勫唴瀹廣?br>涓嶈繃榪欐牱鍜岀洿鎺ョ敤text鍙橀噺鏈変粈涔堝尯鍒憿錛熻矊浼?<!--%s-->" % text涔熷彲浠ュ晩
姘存湪涓婇棶浜嗕竴涓嬶紝寰楀埌鐨勭瓟妗堟槸
鍙戜俊浜? Essien5 (瀹濊礉鏅秪), 淇″尯: Python
鏍? 棰? Re: 鍏充簬locals()鐨勭敤澶?br>鍙戜俊绔? 姘存湪紺懼尯 (Thu Aug 2 11:16:37 2007), 杞俊
濂藉灝辨槸澶氫釜鍙橀噺鏄唬鐮佸緢濂界淮鎶わ紝涓涓瀵瑰簲
'%s%s.......%s'%(a,b,c,d,....,z)
'%(a)s%(b)s......%(z)s'%locals()
絎竴縐嶅啓娉曞墠闈㈢殑%s鍜屽悗闈㈢殑鍙橀噺寰堥毦瀵瑰簲璧鋒潵錛宐ug鐨勬簮娉?br>鍚庝竴涓氨闈炲父鐩磋浜?br>鑰屼笖瑕佸線涓棿鍐嶉殢渚挎彃鍙橀噺涔熸柟渚?/span>
2. 鑷繁鐨勭被緇ф壙浜哠GMLParser鍚庯紝闇瑕佸鐗規畩鏍囪澶勭悊錛屽彲浠ヤ互start_鎴杁o_寮濮嬪懡鍚嶇浉鍏沖嚱鏁般?br>鍙互榪欐牱鍋氱殑鍘熷洜鍦ㄤ簬python鐨勮嚜閱掓満鍒?introspection)
灝卞浗鍐呯洰鍓嶅紩榪涚殑鍞竴涓鏈畻鏄Ruby鐨勪功錛岃浠庤繖鏈功寮濮嬪涔燫uby浼拌浼氬悡璺戜笉灝戞綔鍦ㄧ敤鎴楓備綔鑰呮槸澶х墰娌¢敊錛屼笉榪囨暀瀛﹀垯鏄彟涓鍥炰簨浜嗭紙澶у閮藉簲鏈変綋浼氾紝鏈涓婅鐨勬椂鍊欒璁茬殑鏈濂界殑鑰佸笀閫氬父閮戒笉鏄鏈渶鐗涚殑鑰佸笀錛夈傜己鐐規湁涓ゅ寰堟槑鏄撅細
絎竴鏄嚜欏跺悜涓嬶紝瀹冪殑欏哄簭鏄繖鏍風殑錛?/p>
瀵硅薄鍜岀被–>瀹瑰櫒銆侀泦鍚?#8211;>鏍囧噯綾誨瀷–>琛ㄨ揪寮?#8211;>寮傚父鍜屾ā鍧?#8211;>鍩烘湰杈撳叆杈撳嚭
涓涓粠涓婇檷鍒頒綆鍙堥櫋鐒朵笂鍗囩殑榪囩▼銆備綔鑰呰嚜宸變篃璇村湪絎竴鐗堥噷榪欐牱鐨勬晥鏋滃茍涓嶅ソ錛屽洜姝ゅ湪絎簩鐗堥噷鐗規剰澧炲姞浜嗕竴涓粙緇嶆х珷鑺傦紝綺楃暐鐨勫厛鎶婃墍鏈変笢瑗垮垪緇欒鑰呯湅涓閬嶃傝櫧鐒惰搗鍒頒簺浣滅敤錛屼絾鏄疄闄呮晥鏋滄垜鎯沖浜庡垵瀛﹁呮潵璇翠粛鐒朵笉浼氬お濂姐侰++/Java鐨勪功鎴戦兘璇昏繃涓嶅皯錛屼篃娌¤鍝釜鏄竴涓婃潵灝辨妸Class/Object榪欎簺涓滆タ鐢╃粰璇昏呯殑錛屾繪槸浠庡熀鏈被鍨嬨佹帶鍒惰鍙ヨ繃娓°傞櫎闈炰綘宸茬粡瀵筄O榪欏鐩稿綋鐔熸倝浜嗭紝鍚﹀垯涓婃潵榪欎釜闂ㄦ灝辮兘鎶婁竴鍫嗘柊鎵嬫尅鍦ㄩ棬澶栥?/p>
鎺ヤ笅鏉ョ殑錛岃皥涓嶄笂鍗佸垎鏅︽訂錛屼絾涔熶笉鏄粈涔堣鏉ヨ交蹇殑鍐呭錛屽叧閿槸浣滆呯粰鐨勪緥瀛愯緝灝戯紝浣垮緱璞″潡銆佽凱浠h繖浜涚壒鑹查毦浠ユ帉鎻°傚啀鏈変竴鐐癸紝ruby鐨勮娉曢鏍兼湁鐩稿綋閮ㄥ垎榪樹繚鐣欐湁Perl鐨勭棔榪癸紝鑰孭erl鏄嚭浜嗗悕鐨勪互濂囨鍙瘋憲縐頒簬涓栵紝榪欎簺絎﹀彿鍦ㄦ柊鎵嬬溂閲屼笉澶栧ぉ涔︼紝鑰岄珮鎵嬩滑鍒欑埍涓嶉噴鎵嬨?/p>
鎵浠ワ紝瑕佽兘姣旇緝欏哄埄鐨勯氳繃榪欐湰涔︾殑鍏ラ棬涔嬭礬錛屼綘寰椾簨鍏堝叿鏈塐O鐨勫熀紜錛岃嚦灝戜竴闂ㄨ剼鏈璦鐨勭粡楠岋紙Perl鏈浣籌級錛屽嚱鏁板紡緙栫▼鐨勪竴浜涙蹇碉紙鍚﹀垯褰撲綘鐪嬪埌鍧楃殑涓浜涚敤娉曟椂浼氬緢榪鋒儜錛夈傜劧鍚庯紝鍙互鐢≧uby絎ㄦ嫏鐨勫啓涓浜涘皬紼嬪簭浜嗐?/p>
Ruby浣滀負鍔ㄦ佽璦涔嬩竴錛屽畠鐨勬渶澶х壒鐐硅嚜鐒舵槸“鍔ㄦ?#8221;涓や釜瀛楋紝鍏惰憲鍚嶇殑“duck typing”灝辨槸涓澶т綋鐜幫紙鍦ㄦ垜鐪嬫潵錛屽氨鍍忔槸鍩轟簬鎺ュ彛鐨勮皟鐢紝浣嗗嵈騫朵笉鐢ㄤ竴涓粰瀹氱殑鎺ュ彛鍘諱簨鍏堥檺鍒訛級銆傝繖浜涘湪楂樼駭閮ㄥ垎閲岄兘鏈変笓闂ㄨ榪幫紝鏄簲璇ラ噸鐐瑰涔犵殑閮ㄥ垎銆?/p>
閭d箞鍏ラ棬絀剁珶鐢ㄤ粈涔堜功鏇村ソ錛熸垜鎺ㄨ崘銆奅veryday Scripting with Ruby銆嬭繖鏈傚拰銆奝rogramming Ruby銆嬪悓涓涓嚭鐗堢ぞ錛屼粖騫翠竴鏈堜喚鍒氬嚭浜嗗師鐗堛傚畠鏄互鐩稿綋寰簭娓愯繘鐨勬柟寮忓甫棰嗚鑰呰繘鍏uby鐨勪笘鐣岋紝灝ゅ叾鏄綔鑰呯簿蹇冭璁$殑鍑犱釜Project鏄叏涔︿寒鐐癸紙瀛︿範涓闂ㄨ璦鏈濂界殑鏂瑰紡榪樻槸瑕佸姩鎵嬪啓紼嬪簭錛夈?/p>
鏈鍚庢葷粨濡備笅錛岄鍏堢湅銆奅veryday銆嬭繖鏈功錛岃窡鐫涔︿腑鐨勬寚瀵兼憜寮勮繃鎵鏈夌殑Project錛屽茍瀹屾垚鐩稿簲鐨勭粌涔犮傜劧鍚庡啀鐪嬨奝rogrammin銆嬩竴涔︾殑Crystallized閮ㄥ垎銆傚啀涔嬪悗灝變富瑕佹槸褰撲綔API鍙傝冩墜鍐屼簡銆傝姳閽卞幓涔頒腑鏂囩増鎴戜釜浜鴻寰椾笉鏄緢鏈夊繀瑕侊紝鎬誨叡鍥涢儴鍒嗕腑錛屽墠涓ら儴鍒嗘垜瑙夊緱铔浮鑲嬬殑錛岀鍥涢儴鍒嗗湪鐢佃剳涓婃煡鏇存柟渚匡紝鍙湁絎笁閮ㄥ垎鏈夎緝楂樼殑浠峰箋?/p>
2. String#chomp 鏂規硶
str.chomp(separator=$/) => new_str
Returns a new +String+ with the given record separator removed from
the end of _str_ (if present). If +$/+ has not been changed from
the default Ruby record separator, then +chomp+ also removes
carriage return characters (that is it will remove +\n+, +\r+, and
+\r\n+).
"hello".chomp #=> "hello"
"hello\n".chomp #=> "hello"
"hello\r\n".chomp #=> "hello"
"hello\n\r".chomp #=> "hello\n"
"hello\r".chomp #=> "hello"
"hello \n there".chomp #=> "hello \n there"
"hello".chomp("llo") #=> "he"
3. 鍒ゆ柇鏄惁鍦ㄥ懡浠よ榪愯鑴氭湰
if $0 == __FILE__
check_usage
compare_inventory_files(ARGV[0], ARGV[1])
end
綾諱技浜嶫ava綾葷殑main鏂規硶錛屽湪琚叾浠栫被瀵煎叆鏃朵笉浼氳繍琛屽叾涓殑浠g爜銆?/p>
4. Enumerable#any? 鏂規硶鏌ユ壘涓涓泦鍚堜腑鏄惁鏈夋弧瓚蟲潯浠剁殑鍏冪礌
irb(main):004:0> deposits = [1, 0, 10000]
irb(main):005:0> deposits.any? do | deposit |
irb(main):006:1* deposit > 9999
irb(main):007:1> end
=> true
5. 鍏充簬嫻嬭瘯
榪欐湰涔?Everyday Scripting with Ruby)鐨勫緢澶氱▼搴忛兘鏄緷寰祴璇曢┍鍔ㄥ紑鍙戠殑鎬濇兂鍐欏嚭鏉ョ殑錛屾祴璇曞崟鍏冧腑鐨勬柟娉曢氬父鏈変袱縐嶇洰鐨勩?br/>涓縐嶆槸direct test錛岄渶瑕佹祴璇曢偅涓嚱鏁板氨鐩存帴璋冪敤閭d釜鍑芥暟錛屼紶閫掔殑鍙傛暟閮芥槸鐩存帴鍐欏嚭鏉ョ殑銆?br/>鍙︿竴縐嶆槸bootstrapping test錛岃嫻嬭瘯鍑芥暟鐨勫弬鏁頒篃鏄氳繃鐢熸垚榪欎簺鍙傛暟鐨勫嚱鏁扮敓鎴愮殑錛屽嵆涓涓柟娉曟祴璇曚簡澶氫釜瀵硅薄銆?br/>Everyone finds their own balance between testing directly and testing indirectly. You will too.
6. Time#strftime 鏂規硶
t = Time.now
t.strftime("Printed on %m/%d/%Y") #=> "Printed on 04/09/2003"
t.strftime("at %I:%M%p") #=> "at 08:56AM"
2. List 綾誨瀷
1) 瀹氫箟錛?br>li = ["a", "b", 1]
2) 涓嬫爣浠?寮濮嬨?br>3) 璐熸暟绱㈠紩浠巐ist鐨勫熬閮ㄥ悜鍓嶈鏁版潵瀛樺彇鍏冪礌錛屽嵆
li[-n] == li[len(li) - n]
4) 鍒嗙墖(slice)
>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[1:3] //浠庣2涓厓绱犲埌絎?涓厓绱?br>['b', 'mpilgrim']
>>> li[1:-1] //浠庣2涓厓绱犲埌鍊掓暟絎?涓厓绱?br>['b', 'mpilgrim', 'z']
>>> li[:3]
['a', 'b', 'mpilgrim']
>>> li[3:]
['z', 'example']
>>> li[:]
['a', 'b', 'mpilgrim', 'z', 'example']
5) 澧炲姞鍏冪礌
a) append 鏈熬榪藉姞鍗曚釜鍏冪礌
b) insert 灝嗗崟涓厓绱犳彃鍏ユ煇涓綅緗?br>>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']
>>> li.insert(2, "new")
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new']
c) extend 鍚堝茍鍙︿竴涓狶ist
6) 鎼滅儲
a) index 鏌ユ壘涓涓肩殑棣栨鍑虹幇騫惰繑鍥炵儲寮曞鹼紝濡傛灉娌℃湁鎵懼埌鍒欏紩鍙戝紓甯革紝涓嶫ava涓嶅悓
b) in 鎿嶄綔絎︽祴璇曚竴涓兼槸鍚﹀湪list鍐?/p>
7) 鍒犻櫎鍏冪礌
a) remove 鍒犻櫎鏌愪釜鍏冪礌錛屽涓嶅瓨鍦ㄥ垯寮曞彂寮傚父
b) pop 寮瑰嚭鏍堥《鍏冪礌錛屽嵆鍒犻櫎鏈鍚庝竴涓煎茍榪斿洖璇ュ?/p>
8) List榪愮畻絎?鐪熸柟渚垮晩 -,=
>>> li = ['a', 'b', 'mpilgrim']
>>> li = li + ['example', 'new']
>>> li
['a', 'b', 'mpilgrim', 'example', 'new']
>>> li += ['two']
>>> li
['a', 'b', 'mpilgrim', 'example', 'new', 'two']
>>> li = [1, 2] * 3
>>> li
[1, 2, 1, 2, 1, 2]