** [url]
[b]數字轉化為字元:[/b]
i = 100
text = string(i)
.在ruby的世界中,很多東西不怕你做不到,就怕你想不到。正所謂,思想有多遠,你就可以走多遠。思想不一定非得是自己的,借鑑他人的也很好(不過,做人要厚道,如果是別人的idea,要把思想**說明白、講清楚)。ruby世界是個開放的世界,能在這樣的世界裡生活,那是件很爽的事情。扯了一下淡。。。。
言歸正傳。。。
剛看ruby時,看到 1+「23」這樣的表示式,覺得很n(orth)b,數字跟字元居然可以這樣運算。時間越久,就越想知道為什麼可以這樣做,具體的過程是什麼樣的,在rubinius之前,這個探索是痛苦的。因為ruby是用c語言實現的,而那個c語言的**我看著實在是不習慣。比如下面的**,直到現在也木有弄明白。哪位知道的可以給我指導一下。
static inline void
rb_ary_modify_check(ary)
value ary;
自從有了rubinius,又多了一條探索ruby世界奧秘的路,重要的是,這是條我比較習慣的路。好吧,還是回到1+「23」這個問題上來。
rubinius的實現中,主要用到了3個方法: :+, :redo_coerce,:math_coerce
具體如下:
def +(o)
ruby.primitive :fixnum_add
redo_coerce :+,o
enddef redo_coerce(math,right)
b,a = math_coerce(right)
a.__send__ meth,b
enddef math_coerce(other,error = :coerce_error)
begin
values = other.coerce(self)#[other,self]
rescue
send error,other
endunless values.__kind_of__(array)&&values.length==2 do
raise typeerror,"coerce must return [x,y]"
endvalues[1],values[0]
end
整個實現就差不多了,但是沒完!!!注意到math_coerce這個方法的引數之一是other,而other又呼叫了coerce這個方法。。。。。從中看出點什麼東西來沒????我猜你想到了,要使1+「23」能工作,也就是說能得到24,那麼應該為string類實現coerce(貌似強制的意思)這個方法。
class string
def coerce(n)
if self['.']
values = [n, float(self)]
print "self is ",self,"\n"
[n, float(self)]
else
[n, integer(self)]
endend
end
這樣就大功告成了。理解了這個,也就可以為其他很多的類實現運算,進而可以得到你想要的結果了。north b
以上看的有點暈,下面是我實現的乙個操作:基本符合我的要求
class string
def coerce(n)
if self["."]
values = [n, float(self)]
else
values = [n, integer(self)]
endend
endi = "12.6"
j = "77"
k = 23
m = 0
m += k
puts m
m += j
puts m
m += i
puts m
字串與數字相加
如果乙個是字串或者兩個都是字串,使用 會進行拼接,而不是相加 而如果使用 則會進行強制轉化後做減法運算 var result 12 2 12 2 2 1408 減法強制轉化 document.write result var result1 12 2 12 1412 加法拼接 document.wr...
Objective C中數字 字串
1.在c語言中我們討論的所有數字資料型別,int型 float型和long型都是oc語言中的基本資料型別,但他們都不是物件。如果需要儲存基本資料型別 包括char型 可以使用nsnumber類,它會根據這些資料的型別建立物件。以下是數字物件相見的操作方法。import int main int ar...
1162 數字 字串
時間限制 1000 ms 記憶體限制 65535 kb 難度 0 描述 有一行數字 現在定義 0表示空格,即這行數字被分割成若干個數 要求將這些數按照從小到大順序排列,若該行數字全為零 則表示為零,兩個數字之間可能有多個0,開頭和結尾可能都有0,所有的0都看成空格,數字的個數不超過100。輸入輸入有...