婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Ruby語言中的String深入理解

Ruby語言中的String深入理解

熱門標簽:柯城手機地圖如何做地圖標注 漯河電銷 AI電銷機器人 線路 中牟外呼系統違法嗎 天津外呼系統怎么收費 巫師3地圖標注魔力之所 外呼線路從哪里出來的 淮安自動外呼系統供應商 征服者企業地圖標注
Ruby語言中的String是mutable的,不像java、C#中的String是immutable的。比如
復制代碼 代碼如下:

str1="abc"
str2="abc"

  在java中,對于字面量的字符串,jvm內部維持一張表,因此如果在java中,str1和str2是同一個String對象。而在Ruby中, str1和str2是完全不同的對象。同樣,在java中對于String對象的操作都將產生一個新的對象,而Ruby則是操縱同一個對象,比如:
復制代碼 代碼如下:

str="abc"
str.concat("cdf")

  此時str就是"abccdf"。Ruby對String是怎么處理的呢?我們只談談c ruby中的實現,有興趣的先看看這篇文章《管窺Ruby——對象基礎》。在ruby.h中我們可以看到String對象的結構,Ruby中的對象(包括類也是對象)都是一個一個的struct,String也不能例外:
復制代碼 代碼如下:

struct RString {
struct RBasic basic;
long len;
char *ptr;
union {
long capa;
VALUE shared;
} aux;
};
//ruby.h

 顯然,len是String的長度;ptr是一個char類型的指針,指向實際的字符串;然后是一個聯合,這個稍后再說。如果你看看ruby.h可以發 現,幾乎所有定義的對象結構都有一個struct RBasic。顯然,struct RBasic包含由所有對象結構體共享的一些重要信息的??纯碦Basic:
復制代碼 代碼如下:

struct RBasic {
unsigned long flags;
VALUE klass;
};

  其中的flags是一個多用途的標記,大多數情況下用于記錄結構體的類型,ruby.h中預定義了一些列的宏,比如T_STRING(表示struct RString),T_ARRAY(表示struct RArray)等。Klass是一個VALUE類型,VALUE也是unsigned long,可以地將它當成指針(一個指針4字節,綽綽有余了),它指向的是一個Ruby對象,這里以后再深入。

  那么聯合aux中的capa和shared是干什么用的呢?因為Ruby的String是可變的,可變意味著len可以改變,我們需要每次都根據len的 變換來增減內存(使用c中的realloc()函數),這顯然是一個很大的開銷,解決辦法就是預留一定的空間,ptr指向的內存大小略大于len,這樣就 不需要頻繁調用realloc了,aux.capa就是一個長度,包含額外的內存大小。那么aux.shared是干什么的呢?這是一個VALUE類型, 說明它是指向某個對象。aux.shared其實是用于加快字符串的創建速度,在一個循環中:

  ruby 代碼

  whiletruedo重復 a="str"#以“str”為內容創建字符串,賦值給a a.concat("ing")#為a所指向的對象添加“ing” p(a)#顯示“string” end

  每次都重新創建一個"str"對象,內部就是重復創建一個char[],這是相當奢侈,aux.shared就是用于共享char[],以字面量創建的字符串會共享一個char[],當要發生變化時,將字符串復制到一個非共享的內存中,變化針對這個新拷貝進行,這就是所謂的“copy-on-write"技術。解釋了String的內部構造,貌似還沒有介紹String是怎么實現mutable,我們寫一個Ruby擴展測試下,我們想寫這樣一個Ruby類:

  ruby 代碼

classTestdefteststr="str"str.concat("ing")endend

  對應的c語言代碼就是:

  cpp 代碼
復制代碼 代碼如下:

#include
#include"ruby.h"staticVALUEt_test(VALUEself){
VALUEstr;str=rb_str_new2("str");
printf("beforeconcat:str:%p,
str.aux.shared:%p,str.ptr:%s"n",str,(RSTRING(str)->aux).shared,RSTRING(str)->ptr);
rb_str_cat2(str,"ing");
printf("afterconcat:str:%p,str.aux.shared:%p,str.ptr:%s"n",
str,(RSTRING(str)->aux).shared,RSTRING(str)->ptr);returnself;
}
VALUEcTest;
voidInit_string_hack(){
cTest=rb_define_class("Test",rb_cObject);
rb_define_method(cTest,"test",t_test,0);
}//string_hack.c

  rb_define_class函數定義了一個類Test,rb_define_method將t_test方法以test的名稱添加到Test類。在t_test中,通過rb_str_new2每次生成一個RString結構,然后通過rb_str_cat2將str與"ing"連接起來,添加了一些打印用于跟蹤。利用mkmf產生Makefile,寫一個extconf.rb

  ruby 代碼

require'mkmf'create_makefile("string_hack");

  執行ruby extconf.rb,將產生一個Makefile,執行make,生成一個string_hack.so的鏈接庫。擴展寫完了,通過ruby調用:

  ruby 代碼

require'string_hack"t=Test.new(1..3).each{|i|t.test}

  輸出:

before concat: str:0x40098a40, str.aux.shared:0x3, str.ptr:str
after concat: str:0x40098a40, str.aux.shared:0x8, str.ptr:string
before concat: str:0x40098a2c, str.aux.shared:0x3, str.ptr:str
after concat: str:0x40098a2c, str.aux.shared:0x8, str.ptr:string
before concat: str:0x40098a18, str.aux.shared:0x3, str.ptr:str
after concat: str:0x40098a18, str.aux.shared:0x8, str.ptr:string

  從結果可以看出,在str concat之前之后,str指向的位置沒有改變,改變的僅僅是str中ptr指向的字符串的值,看看rb_str_cat2函數的實現就一目了然了:

  cpp 代碼
復制代碼 代碼如下:

VALUErb_str_cat(str,ptr,len)VALUEstr;
constchar*ptr;
longlen;
{
if(len0){rb_raise(rb_eArgError,"negativestringsize(orsizetoobig)");
}
if(FL_TEST(str,STR_ASSOC))
{
rb_str_modify(str);
REALLOC_N(RSTRING(str)->ptr,char,RSTRING(str)->len+len);
memcpy(RSTRING(str)->ptr+RSTRING(str)->len,ptr,len);
RSTRING(str)->len+=len;
RSTRING(str)->ptr[RSTRING(str)->len]='"0';
/*sentinel*/
returnstr;
}
returnrb_str_buf_cat(str,ptr,len);
}
VALUErb_str_cat2(str,ptr)VALUEstr;
constchar*ptr;
{
returnrb_str_cat(str,ptr,strlen(ptr));
}
//string.c
您可能感興趣的文章:
  • Ruby微信開發的幾個開源項目介紹
  • Ruby On Rails上手筆記(安裝使用全過程)
  • ruby安裝gem包失敗的通用解決方法
  • 淘寶網提供的國內RubyGems鏡像簡介和使用方法
  • Ruby rails 頁面跳轉(render和redirect_to)
  • ruby 學習筆記(2) 類的基本使用
  • 蘋果mac OS X上安裝metasploit

標簽:南昌 西雙版納 棗莊 大慶 內江 甘孜 克拉瑪依 河池

巨人網絡通訊聲明:本文標題《Ruby語言中的String深入理解》,本文關鍵詞  Ruby,語言,中的,String,深入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Ruby語言中的String深入理解》相關的同類信息!
  • 本頁收集關于Ruby語言中的String深入理解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产日韩欧美高清| 国产成人欧美日韩在线电影| 日韩二区在线观看| 成人av在线播放网站| 日韩午夜三级在线| 亚洲激情五月婷婷| 国产成人av一区二区| 欧美一卡二卡三卡| 亚洲靠逼com| 成人av在线电影| 久久久高清一区二区三区| 天堂va蜜桃一区二区三区漫画版| 成人ar影院免费观看视频| 日韩欧美国产一二三区| 亚洲一卡二卡三卡四卡无卡久久| 成人av资源站| 国产女同性恋一区二区| 韩国一区二区视频| 欧美一区二区三区在线观看| 性感美女极品91精品| 欧美日韩一区不卡| 亚洲一区二区影院| 欧美在线播放高清精品| 亚洲一区二区三区四区在线 | 国产精品网站在线观看| 免费成人小视频| 欧美成人性战久久| 免费在线看一区| 日韩欧美一卡二卡| 精品一区二区三区影院在线午夜 | 国产欧美1区2区3区| 国产一区二区日韩精品| 久久精品亚洲麻豆av一区二区| 国内精品伊人久久久久影院对白| 久久综合色天天久久综合图片| 麻豆一区二区三| 久久久精品影视| 国产精品系列在线观看| 亚洲一区二区精品3399| 一区二区中文视频| 中文字幕精品三区| 欧美国产欧美亚州国产日韩mv天天看完整 | 91麻豆精品国产91久久久使用方法| 免费人成黄页网站在线一区二区| 亚洲免费看黄网站| 国产精品久线观看视频| 久久综合色综合88| 日本一区二区三区免费乱视频| 精品国产一二三区| 337p粉嫩大胆噜噜噜噜噜91av| 久久久久久久综合色一本| 91黄色免费观看| 欧美色男人天堂| 国模套图日韩精品一区二区| 亚洲综合在线电影| 美女mm1313爽爽久久久蜜臀| 国产精品一卡二| 中文字幕一区不卡| 日韩美女天天操| 成人av影院在线| 亚洲一区二区偷拍精品| 日韩精品一区二区三区swag | **网站欧美大片在线观看| 欧美性极品少妇| 国产一区高清在线| 一区二区三区免费在线观看| 欧美一区二区女人| 99国产精品一区| 久久精品国产秦先生| 亚洲人吸女人奶水| 精品久久久久久久久久久久久久久| 成人开心网精品视频| 天天综合网天天综合色| 国产精品视频在线看| 欧美一级日韩免费不卡| 色综合久久久久综合99| 黄页视频在线91| 偷拍日韩校园综合在线| 国产精品嫩草99a| 欧美一卡二卡在线| 色天使久久综合网天天| 国产盗摄女厕一区二区三区| 青青草原综合久久大伊人精品优势| 中文字幕在线一区免费| 精品久久久久99| 日韩无一区二区| 欧美日韩美少妇| 在线观看网站黄不卡| av在线一区二区| 懂色一区二区三区免费观看| 九九国产精品视频| 蜜臀av一级做a爰片久久| 自拍偷拍亚洲欧美日韩| 欧美国产精品专区| 欧美成人三级在线| 日韩精品中文字幕一区二区三区| 日本韩国一区二区三区视频| 白白色 亚洲乱淫| 国产成人aaa| 黄色小说综合网站| 国产在线精品一区二区| 精品一区二区三区免费观看| 日韩av电影免费观看高清完整版| 亚洲成人精品影院| 亚洲综合激情小说| 亚洲高清久久久| 亚洲亚洲精品在线观看| 亚洲午夜久久久久| 一区二区三区精品在线| 亚洲精品亚洲人成人网在线播放| 国产精品女主播在线观看| 日本一区二区免费在线观看视频| 亚洲精品在线网站| 国产视频一区二区在线观看| 久久久久久久久岛国免费| 精品福利一区二区三区免费视频| 日韩精品中文字幕一区 | 欧美精品1区2区3区| 欧美老肥妇做.爰bbww| 91精品综合久久久久久| 日韩欧美一区二区久久婷婷| 精品美女被调教视频大全网站| 欧美tk丨vk视频| 国产欧美日韩激情| 亚洲男人的天堂在线观看| 一区二区免费看| 久久99热这里只有精品| 成人性生交大片免费看视频在线 | 不卡av在线免费观看| 成人av网址在线| 91亚洲精华国产精华精华液| 欧洲另类一二三四区| 欧美日韩一区小说| 精品成人一区二区三区四区| 中文字幕av不卡| 亚洲午夜电影在线观看| 精品无人区卡一卡二卡三乱码免费卡| 国产一区视频网站| 色噜噜久久综合| 欧美不卡一二三| 亚洲精品视频自拍| 热久久一区二区| 99精品国产视频| 欧美一二三区精品| 国产精品嫩草影院av蜜臀| 亚洲电影你懂得| 成人午夜在线播放| 欧美一区午夜精品| 中文一区二区在线观看| 亚洲午夜av在线| 国产a精品视频| 91麻豆精品国产91久久久久| 国产精品国产三级国产aⅴ中文 | 91色婷婷久久久久合中文| 3d动漫精品啪啪1区2区免费| 国产精品色婷婷| 免费成人在线观看| 欧美午夜在线一二页| 中文无字幕一区二区三区| 日韩电影免费在线观看网站| 99精品视频免费在线观看| 精品国产乱码久久久久久浪潮| 综合激情成人伊人| 国产尤物一区二区| 91麻豆精品国产自产在线| 亚洲欧美日韩国产中文在线| 国产精品18久久久久| 69堂成人精品免费视频| 亚洲免费av观看| 国产成人日日夜夜| 日韩丝袜情趣美女图片| 一区二区日韩电影| a美女胸又www黄视频久久| 久久精品一区二区三区不卡牛牛| 亚洲bt欧美bt精品777| 色狠狠一区二区三区香蕉| 久久久www成人免费无遮挡大片| 日韩中文字幕区一区有砖一区| 久久精品国产99国产精品| 99久久777色| 亚洲精品成人悠悠色影视| 国产成人日日夜夜| 国产日韩欧美a| 97se亚洲国产综合自在线| 国产精品沙发午睡系列990531| 国产美女在线精品| 中文字幕一区二区三区在线不卡 | 国产一区在线精品| 777欧美精品| 国产高清不卡一区二区| 久久久噜噜噜久久中文字幕色伊伊| 亚洲国产精品一区二区尤物区| 99精品欧美一区二区蜜桃免费| 一区二区三区四区视频精品免费 | 精品国产91洋老外米糕| 不卡大黄网站免费看| 九色综合狠狠综合久久| 国内成人免费视频| 亚洲一区二区三区视频在线| 欧美日韩国产免费一区二区|