- 1_8_6_287
- 1_8_7_72
- 1_8_7_330
- 1_9_1_378
- 1_9_2_180
- 1_9_3_125
- 1_9_3_392
- 2_1_10
- 2_2_9
- 2_4_6 (0)
- 2_5_5 (33)
- 2_6_3 (38)
- What's this?
# extension.ja.rdoc - -*- RDoc -*- created at: Mon Aug 7 16:45:54 JST 1995
Rubyã®æ¡å¼µã©ã¤ãã©ãªã®ä½ãæ¹
Rubyã®æ¡å¼µã©ã¤ãã©ãªã®ä½ãæ¹ã説æãã¾ãï¼
åºç¤ç¥è
Cã®å¤æ°ã«ã¯åãããï¼ãã¼ã¿ã«ã¯åãããã¾ããï¼ã§ãããï¼ã ã¨ãã°ãã¤ã³ã¿ãintã®å¤æ°ã«ä»£å ¥ããã¨ï¼ãã®å¤ã¯æ´æ°ã¨ãã¦å ãæ±ããã¾ãï¼éã«Rubyã®å¤æ°ã«ã¯åããªãï¼ãã¼ã¿ã«åãããã¾ ãï¼ãã®éãã®ããï¼Cã¨Rubyã¯ç¸äºã«å¤æããªããã°ï¼ãäºãã® ãã¼ã¿ãã¢ã¯ã»ã¹ã§ãã¾ããï¼
Rubyã®ãã¼ã¿ã¯VALUEã¨ããCã®åã§è¡¨ç¾ããã¾ãï¼VALUEåã®ãã¼ ã¿ã¯ãã®ãã¼ã¿ã¿ã¤ããèªåã§ç¥ã£ã¦ãã¾ãï¼ãã®ãã¼ã¿ã¿ã¤ã㨠ããã®ã¯ãã¼ã¿(ãªãã¸ã§ã¯ã)ã®å®éã®æ§é ãæå³ãã¦ãã¦ï¼Ruby ã®ã¯ã©ã¹ã¨ã¯ã¾ãéã£ããã®ã§ãï¼
VALUEããCã«ã¨ã£ã¦æå³ã®ãããã¼ã¿ãåãåºãããã«ã¯
-
VALUEã®ãã¼ã¿ã¿ã¤ããç¥ã
-
VALUEãCã®ãã¼ã¿ã«å¤æãã
ã®ä¸¡æ¹ãå¿ è¦ã§ãï¼(1)ãå¿ããã¨ééã£ããã¼ã¿ã®å¤æãè¡ãã ã¦ï¼ææªããã°ã©ã ãcore dumpãã¾ãï¼
ãã¼ã¿ã¿ã¤ã
Rubyã«ã¯ã¦ã¼ã¶ã使ãå¯è½æ§ã®ãã以ä¸ã®ã¿ã¤ããããã¾ãï¼
T_NIL |
nil |
T_OBJECT |
é常ã®ãªãã¸ã§ã¯ã |
T_CLASS |
ã¯ã©ã¹ |
T_MODULE |
ã¢ã¸ã¥ã¼ã« |
T_FLOAT |
æµ®åå°æ°ç¹æ° |
T_STRING |
æåå |
T_REGEXP |
æ£è¦è¡¨ç¾ |
T_ARRAY |
é å |
T_HASH |
é£æ³é å |
T_STRUCT |
(Rubyã®)æ§é ä½ |
T_BIGNUM |
å¤åé·æ´æ° |
T_FIXNUM |
Fixnum(31bitã¾ãã¯63bité·æ´æ°) |
T_COMPLEX |
è¤ç´ æ° |
T_RATIONAL |
æçæ° |
T_FILE |
å ¥åºå |
T_TRUE |
ç |
T_FALSE |
å½ |
T_DATA |
ãã¼ã¿ |
T_SYMBOL |
ã·ã³ãã« |
ãã®ä»ã«å é¨ã§å©ç¨ããã¦ãã以ä¸ã®ã¿ã¤ããããã¾ãï¼
T_ICLASS T_MATCH T_UNDEF T_NODE T_ZOMBIE
ã»ã¨ãã©ã®ã¿ã¤ãã¯Cã®æ§é ä½ã§å®è£ ããã¦ãã¾ãï¼
VALUEã®ãã¼ã¿ã¿ã¤ãããã§ãã¯ãã
ruby.hã§ã¯TYPE()ã¨ãããã¯ããå®ç¾©ããã¦ãã¦ï¼VALUEã®ãã¼ã¿ ã¿ã¤ããç¥ããã¨ãåºæ¥ã¾ãï¼TYPE()ãã¯ãã¯ä¸ã§ç´¹ä»ããT_XXXX ã®å½¢å¼ã®å®æ°ãè¿ãã¾ãï¼VALUEã®ãã¼ã¿ã¿ã¤ãã«å¿ãã¦å¦çãã å ´åã«ã¯ï¼TYPE()ã®å¤ã§åå²ãããã¨ã«ãªãã¾ãï¼
switch (TYPE(obj)) { case T_FIXNUM: /* FIXNUMã®å¦ç */ break; case T_STRING: /* æååã®å¦ç */ break; case T_ARRAY: /* é åã®å¦ç */ break; default: /* ä¾å¤ãçºçããã */ rb_raise(rb_eTypeError, "not valid value"); break; }
ããã¨ãã¼ã¿ã¿ã¤ãããã§ãã¯ãã¦ï¼æ£ãããªããã°ä¾å¤ãçºçã ãé¢æ°ãç¨æããã¦ãã¾ãï¼
void Check_Type(VALUE value, int type)
ãã®é¢æ°ã¯valueãtypeã§ç¡ããã°ï¼ä¾å¤ãçºçããã¾ãï¼å¼æ°ã¨ ãã¦ä¸ããããVALUEã®ãã¼ã¿ã¿ã¤ããæ£ãããã©ãããã§ãã¯ã ãããã«ã¯ï¼ãã®é¢æ°ã使ãã¾ãï¼
FIXNUMã¨NILã«é¢ãã¦ã¯ããé«éãªå¤å¥ãã¯ããç¨æããã¦ãã¾ãï¼
FIXNUM_P(obj) NIL_P(obj)
VALUEãCã®ãã¼ã¿ã«å¤æãã
ãã¼ã¿ã¿ã¤ããT_NILï¼T_FALSEï¼T_TRUEã§ããæï¼ãã¼ã¿ã¯ããã ãnilï¼falseï¼trueã§ãï¼ãã®ãã¼ã¿ã¿ã¤ãã®ãªãã¸ã§ã¯ãã¯ã²ã¨ ã¤ãã¤ããåå¨ãã¾ããï¼
ãã¼ã¿ã¿ã¤ããT_FIXNUMã®æï¼ããã¯31bitã¾ãã¯63bitã®ãµã¤ãºã æã¤æ´æ°ã§ãï¼longã®ãµã¤ãºã32bitã®ãã©ãããã©ã¼ã ã§ããã° 31bitã«ï¼longã®ãµã¤ãºã64bitã®ãã©ãããã©ã¼ã ã§ããã°63bit ã«ãªãã¾ã. FIXNUM ã C ã®æ´æ°ã«å¤æããããã«ã¯ãã¯ã ãFIX2INT()ãã¾ãã¯ãFIX2LONG()ãã使ãã¾ãï¼ãããã®ãã¯ã ã使ç¨ããéã«ã¯äºåã«ãã¼ã¿ã¿ã¤ããFIXNUMã§ãããã¨ã確èªã ãå¿ è¦ãããã¾ããï¼æ¯è¼çé«éã«å¤æãè¡ããã¨ãã§ãã¾ãï¼ã¾ ãï¼ãFIX2LONG()ãã¯ä¾å¤ãçºçãã¾ãããï¼ãFIX2INT()ãã¯å¤ æçµæãintã®ãµã¤ãºã«åã¾ããªãå ´åã«ã¯ä¾å¤ãçºçãã¾ãï¼ ããããï¼FIXNUMã«éããRubyã®ãã¼ã¿ãæ´æ°ã«å¤æãã ãNUM2INT()ãããã³ãNUM2LONG()ãã¨ãããã¯ããããã¾ãï¼ã ããã®ãã¯ãã¯ãã¼ã¿ã¿ã¤ãã®ãã§ãã¯ç¡ãã§ä½¿ãã¾ã (æ´æ°ã«å¤æã§ããªãå ´åã«ã¯ä¾å¤ãçºçãã)ï¼åæ§ã«ãã§ãã¯ç¡ã ã§ä½¿ããå¤æãã¯ãã¯doubleãåãåºããNUM2DBL()ããããã¾ãï¼
char* ãåãåºãå ´åï¼ StringValue() 㨠StringValuePtr() ã使ãã¾ãï¼ StringValue(var) 㯠var ã String ã§ããã°ä½ãããï¼ããã§ãªããã° var ã var.to_str() ã®çµæ ã«ç½®ãæãããã¯ãï¼StringValuePtr(var) ã¯åæ§ã« var ã String ã«ç½®ãæãã¦ãã var ã®ãã¤ãå表ç¾ã«å¯¾ãã char* ã è¿ããã¯ãã§ãï¼var ã®å 容ãç´æ¥ç½®ãæããå¦çãå ¥ãã®ã§ï¼ var 㯠lvalue ã§ããå¿ è¦ãããã¾ãï¼ ã¾ãï¼StringValuePtr() ã«é¡ä¼¼ãã StringValueCStr() ã¨ããã ã¯ããããã¾ãï¼StringValueCStr(var) 㯠var ã String ã«ç½®ã æãã¦ãã var ã®æåå表ç¾ã«å¯¾ãã char* ãè¿ãã¾ãï¼è¿ãã ãæååã®æ«å°¾ã«ã¯ NUL æåãä»å ããã¾ãï¼ãªãï¼éä¸ã« NUL æåãå«ã¾ããå ´å㯠ArgumentError ãçºçãã¾ãï¼ ä¸æ¹ï¼StringValuePtr() ã§ã¯ï¼æ«å°¾ã« NUL æåãããä¿è¨¼ã¯ãªãï¼ éä¸ã« NUL æåãå«ã¾ãã¦ããå¯è½æ§ãããã¾ãï¼
ãã以å¤ã®ãã¼ã¿ã¿ã¤ãã¯å¯¾å¿ããCã®æ§é ä½ãããã¾ãï¼å¯¾å¿ã ãæ§é ä½ã®ããVALUEã¯ãã®ã¾ã¾ãã£ã¹ã(åå¤æ)ããã°æ§é ä½ã® ãã¤ã³ã¿ã«å¤æã§ãã¾ãï¼
æ§é ä½ã¯ãstruct RXxxxxãã¨ããååã§ruby.hã§å®ç¾©ããã¦ãã¾ ãï¼ä¾ãã°æååã¯ãstruct RStringãã§ãï¼å®éã«ä½¿ãå¯è½æ§ã ããã®ã¯æååã¨é åãããã ã¨æãã¾ãï¼
ruby.hã§ã¯æ§é ä½ã¸ãã£ã¹ããããã¯ãããRXXXXX()ã(å ¨é¨å¤§æ åã«ãããã®)ã¨ããååã§æä¾ããã¦ãã¾ã(ä¾: RSTRING())ï¼ã ã ããæ§é ä½ã¸ã®ç´æ¥ã®ã¢ã¯ã»ã¹ã¯ã§ããã ãé¿ãï¼å¯¾å¿ãã rb_xxxx() ã¨ãã£ãé¢æ°ã使ãããã«ãã¦ä¸ããï¼ä¾ãã°ï¼é åã® è¦ç´ ã¸ã¢ã¯ã»ã¹ããå ´åã¯ï¼rb_ary_entry(ary, offset)ï¼ rb_ary_store(ary, offset, obj) ãå©ç¨ããããã«ãã¦ä¸ããï¼
æ§é ä½ãããã¼ã¿ãåãåºããã¯ããæä¾ããã¦ãã¾ãï¼æåå strã®é·ããå¾ãããã«ã¯ãRSTRING_LEN(str)ãã¨ãï¼æååstrã char*ã¨ãã¦å¾ãããã«ã¯ãRSTRING_PTR(str)ãã¨ãã¾ãï¼
Rubyã®æ§é ä½ãç´æ¥ã¢ã¯ã»ã¹ããæã«æ°ãã¤ããªããã°ãªããªãã ã¨ã¯ï¼é åãæååã®æ§é ä½ã®ä¸èº«ã¯åç §ããã ãã§ï¼ç´æ¥å¤æ´ã ãªããã¨ã§ãï¼ç´æ¥å¤æ´ããå ´åï¼ãªãã¸ã§ã¯ãã®å 容ã®æ´åæ§ã ã¨ããªããªã£ã¦ï¼æãã¬ãã°ã®åå ã«ãªãã¾ãï¼
Cã®ãã¼ã¿ãVALUEã«å¤æãã
VALUEã®å®éã®æ§é ã¯
FIXNUMã®å ´å |
1bitå·¦ã·ãããã¦ï¼LSBãç«ã¦ãï¼ |
ãã®ä»ã®ãã¤ã³ã¿ã®å ´å |
ãã®ã¾ã¾VALUEã«ãã£ã¹ãããï¼ |
ã¨ãªã£ã¦ãã¾ãï¼ãã£ã¦ï¼LSBããã§ãã¯ããã°VALUEãFIXNUMãã© ãããããããã§ã(ãã¤ã³ã¿ã®LSBãç«ã£ã¦ããªããã¨ãä»®å®ã㦠ãã)ï¼
ã§ãããï¼FIXNUM以å¤ã®Rubyã®ãªãã¸ã§ã¯ãã®æ§é ä½ã¯åã«VALUE ã«ãã£ã¹ãããã ãã§VALUEã«å¤æåºæ¥ã¾ãï¼ãã ãï¼ä»»æã®æ§é ä½ãVALUEã«ãã£ã¹ãåºæ¥ãããã§ã¯ããã¾ããï¼ãã£ã¹ãããã® ã¯Rubyã®ç¥ã£ã¦ããæ§é ä½(ruby.hã§å®ç¾©ããã¦ããstruct RXxxx ã®ãã®)ã ãã§ãï¼
FIXNUMã«é¢ãã¦ã¯å¤æãã¯ããçµç±ããå¿ è¦ãããã¾ãï¼Cã®æ´æ° ããVALUEã«å¤æãããã¯ãã¯ä»¥ä¸ã®ãã®ãããã¾ãï¼å¿ è¦ã«å¿ã ã¦ä½¿ãåãã¦ãã ããï¼
INT2FIX() |
ãã¨ã®æ´æ°ã31bitã¾ãã¯63bit以å ã«åã¾ãèªä¿¡ ãããæ |
INT2NUM() |
ä»»æã®æ´æ°ããVALUE㸠|
INT2NUM()ã¯æ´æ°ãFIXNUMã®ç¯å²ã«åã¾ããªãå ´åï¼Bignumã«å¤æ ãã¦ããã¾ã(ãï¼å°ãé ã)ï¼
Rubyã®ãã¼ã¿ãæä½ãã
å ç¨ãè¿°ã¹ãéãï¼Rubyã®æ§é ä½ãã¢ã¯ã»ã¹ããæã«å 容ã®æ´æ°ã è¡ããã¨ã¯å§ãããã¾ããï¼ã§ï¼Rubyã®ãã¼ã¿ãæä½ããæã«ã¯ Rubyãç¨æãã¦ããé¢æ°ãç¨ãã¦ãã ããï¼
ããã§ã¯ãã£ã¨ã使ãããã§ãããæååã¨é åã®çæ/æä½ãè¡ ãé¢æ°ãããã¾ã(å ¨é¨ã§ã¯ãªãã§ã)ï¼
æååã«å¯¾ããé¢æ°
rb_str_new(const char *ptr, long len) |
æ°ããRubyã®æååãçæããï¼ |
rb_str_new2(const char *ptr) |
|
rb_str_new_cstr(const char *ptr) |
Cã®æååããRubyã®æååãçæããï¼ãã®é¢æ°ã®æ©è½ã¯ rb_str_new(ptr, strlen(ptr))ã¨åçã§ããï¼ |
rb_str_new_literal(const char *ptr) |
Cã®ãªãã©ã«æååããRubyã®æååãçæããï¼ |
rb_tainted_str_new(const char *ptr, long len) |
æ±æãã¼ã¯ãä»å ãããæ°ããRubyã®æååãçæããï¼å¤é¨ ããã®ãã¼ã¿ã«åºã¥ãæååã«ã¯æ±æãã¼ã¯ãä»å ãããã¹ã ã§ããï¼ |
rb_tainted_str_new2(const char *ptr) |
|
rb_tainted_str_new_cstr(const char *ptr) |
Cã®æååããæ±æãã¼ã¯ãä»å ãããRubyã®æååãçæããï¼ |
rb_str_append(VALUE str1, VALUE str2) |
Rubyã®æååstr1ã«Rubyã®æååstr2ã追å ããï¼ |
rb_sprintf(const char *format, …) |
|
rb_vsprintf(const char *format, va_list ap) |
Cã®æååformatã¨ç¶ãå¼æ°ãprintf(3)ã®ãã©ã¼ãããã«ãããã£ã¦ æ´å½¢ãï¼Rubyã®æååãçæããï¼ æ³¨æ: “%”PRIsVALUEãObject#to_s(‘+’ãã©ã°ãæå®ããã¦ãã ã¨ãã¯Object#inspect)ã使ã£ãVALUEã®åºåã«å©ç¨ã§ããï¼ãã 㯓%i”ã¨è¡çªããããï¼æ´æ°ã«ã¯“%d”ã使ç¨ãããã¨ï¼ |
rb_str_cat(VALUE str, const char *ptr, long len) |
Rubyã®æååstrã«lenãã¤ãã®æååptrã追å ããï¼ |
rb_str_cat2(VALUE str, const char* ptr) |
|
rb_str_cat_cstr(VALUE str, const char* ptr) |
Rubyã®æååstrã«Cã®æååptrã追å ããï¼ãã®é¢æ°ã®æ©è½ã¯ rb_str_cat(str, ptr, strlen(ptr))ã¨åçã§ããï¼ |
rb_str_catf(VALUE str, const char* format, …) |
|
rb_str_vcatf(VALUE str, const char* format, va_list ap) |
Cã®æååformatã¨ç¶ãå¼æ°ãprintf(3)ã®ãã©ã¼ãããã«ãããã£ã¦ æ´å½¢ãï¼Rubyã®æååstrã«è¿½å ããï¼ãã®é¢æ°ã®æ©è½ã¯ï¼ãããã rb_str_append(str, rb_sprintf(format, …)) ã rb_str_append(str, rb_vsprintf(format, ap)) ã¨åçã§ããï¼ |
rb_enc_str_new(const char *ptr, long len, rb_encoding *enc) |
|
rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc) |
æå®ãããã¨ã³ã³ã¼ãã£ã³ã°ã§Rubyã®æååãçæãã. |
rb_enc_str_new_literal(const char *ptr, rb_encoding *enc) |
Cã®ãªãã©ã«æååããæå®ãããã¨ã³ã³ã¼ãã£ã³ã°ã§Rubyã®æååãçæããï¼ |
rb_usascii_str_new(const char *ptr, long len) |
|
rb_usascii_str_new_cstr(const char *ptr) |
ã¨ã³ã³ã¼ãã£ã³ã°ãUS-ASCIIã®Rubyã®æååãçæãã. |
rb_usascii_str_new_literal(const char *ptr) |
Cã®ãªãã©ã«æååããã¨ã³ã³ã¼ãã£ã³ã°ãUS-ASCIIã®Rubyã®æååãçæããï¼ |
rb_utf8_str_new(const char *ptr, long len) |
|
rb_utf8_str_new_cstr(const char *ptr) |
ã¨ã³ã³ã¼ãã£ã³ã°ãUTF-8ã®Rubyã®æååãçæãã. |
rb_utf8_str_new_literal(const char *ptr) |
Cã®ãªãã©ã«æååããã¨ã³ã³ã¼ãã£ã³ã°ãUTF-8ã®Rubyã®æååãçæããï¼ |
rb_str_resize(VALUE str, long len) |
Rubyã®æååã®ãµã¤ãºãlenãã¤ãã«å¤æ´ããï¼strã®é·ãã¯å 以ã¦ã»ããããã¦ããªããã°ãªããªãï¼lenãå ã®é·ããããç ãæã¯ï¼lenãã¤ããè¶ããé¨åã®å 容ã¯æ¨ã¦ãããï¼lenãå ã®é·ããããé·ãæã¯ï¼å ã®é·ããè¶ããé¨åã®å 容ã¯ä¿åã ããªãã§ã´ãã«ãªãã ããï¼ãã®é¢æ°ã®å¼ã³åºãã«ãã£ã¦ RSTRING_PTR(str)ãå¤æ´ããããããããªããã¨ã«æ³¨æï¼ |
rb_str_set_len(VALUE str, long len) |
Rubyã®æååã®ãµã¤ãºãlenãã¤ãã«ã»ããããï¼strãå¤æ´å¯ è½ã§ãªããã°ä¾å¤ãçºçããï¼RSTRING_LEN(str)ã¨ã¯ç¡é¢ä¿ã«ï¼ lenãã¤ãã¾ã§ã®å 容ã¯ä¿åãããï¼lenã¯strã®å®¹éãè¶ãã¦ã ã¦ã¯ãªããªãï¼ |
é åã«å¯¾ããé¢æ°
rb_ary_new() |
è¦ç´ ã0ã®é åãçæããï¼ |
rb_ary_new2(long len) |
|
rb_ary_new_capa(long len) |
è¦ç´ ã0ã®é åãçæããï¼lenè¦ç´ åã®é åããããããå²ã å½ã¦ã¦ããï¼ |
rb_ary_new3(long n, …) |
|
rb_ary_new_from_args(long n, …) |
å¼æ°ã§æå®ããnè¦ç´ ãå«ãé åãçæããï¼ |
rb_ary_new4(long n, VALUE *elts) |
|
rb_ary_new_from_values(long n, VALUE *elts) |
é åã§ä¸ããnè¦ç´ ã®é åãçæããï¼ |
rb_ary_to_ary(VALUE obj) |
ãªãã¸ã§ã¯ããé åã«å¤æãã. Object#to_aryã¨åçã§ãã. |
ä»ã«ãé åãæä½ããé¢æ°ãå¤æ°ãã. ããã㯠å¼æ°aryã«é åã渡ããªããã°ãªããªã. ãããªã㨠ã³ã¢ãåã.
rb_ary_aref(int argc, const VALUE *argv, VALUE ary) |
Array#[]ã¨åç. |
rb_ary_entry(VALUE ary, long offset) |
ary[offset] |
rb_ary_store(VALUE ary, long offset, VALUE obj) |
ary[offset] = obj |
rb_ary_subseq(VALUE ary, long beg, long len) |
ary[beg, len] |
rb_ary_push(VALUE ary, VALUE val) |
|
rb_ary_pop(VALUE ary) |
|
rb_ary_shift(VALUE ary) |
|
rb_ary_unshift(VALUE ary, VALUE val) |
ary.push, ary.pop, ary.shift, ary.unshift |
rb_ary_cat(VALUE ary, const VALUE *ptr, long len) |
é åaryã«ptrããlenåã®ãªãã¸ã§ã¯ãã追å ããï¼ |
Rubyã®æ©è½ã使ã
åççã«Rubyã§æ¸ãããã¨ã¯Cã§ãæ¸ãã¾ãï¼Rubyãã®ãã®ãCã§è¨ è¿°ããã¦ãããã§ãããï¼å½ç¶ã¨ããã°å½ç¶ãªãã§ããã©ï¼ãã㧠ã¯Rubyã®æ¡å¼µã«ä½¿ããã¨ãå¤ãã ããã¨äºæ¸¬ãããæ©è½ãä¸å¿ã«ç´¹ ä»ãã¾ãï¼
Rubyã«æ©è½ã追å ãã
Rubyã§æä¾ããã¦ããé¢æ°ã使ãã°Rubyã¤ã³ã¿ããªã¿ã«æ°ããæ©è½ ã追å ãããã¨ãã§ãã¾ãï¼Rubyã§ã¯ä»¥ä¸ã®æ©è½ã追å ããé¢æ°ã æä¾ããã¦ãã¾ãï¼
-
ã¯ã©ã¹ï¼ã¢ã¸ã¥ã¼ã«
-
ã¡ã½ããï¼ç¹ç°ã¡ã½ãããªã©
-
å®æ°
ã§ã¯é ã«ç´¹ä»ãã¾ãï¼
ã¯ã©ã¹/ã¢ã¸ã¥ã¼ã«å®ç¾©
ã¯ã©ã¹ãã¢ã¸ã¥ã¼ã«ãå®ç¾©ããããã«ã¯ï¼ä»¥ä¸ã®é¢æ°ã使ãã¾ãï¼
VALUE rb_define_class(const char *name, VALUE super) VALUE rb_define_module(const char *name)
ãããã®é¢æ°ã¯æ°ããå®ç¾©ãããã¯ã©ã¹ãã¢ã¸ã¥ã¼ã«ãè¿ãã¾ãï¼ ã¡ã½ãããå®æ°ã®å®ç¾©ã«ãããã®å¤ãå¿ è¦ãªã®ã§ï¼ã»ã¨ãã©ã®å ´å ã¯æ»ãå¤ãå¤æ°ã«æ ¼ç´ãã¦ããå¿ è¦ãããã§ãããï¼
ã¯ã©ã¹ãã¢ã¸ã¥ã¼ã«ãä»ã®ã¯ã©ã¹ã®å é¨ã«ãã¹ããã¦å®ç¾©ããæã« ã¯ä»¥ä¸ã®é¢æ°ã使ãã¾ãï¼
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super) VALUE rb_define_module_under(VALUE outer, const char *name)
ã¡ã½ãã/ç¹ç°ã¡ã½ããå®ç¾©
ã¡ã½ãããç¹ç°ã¡ã½ãããå®ç¾©ããã«ã¯ä»¥ä¸ã®é¢æ°ã使ãã¾ãï¼
void rb_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc) void rb_define_singleton_method(VALUE object, const char *name, VALUE (*func)(ANYARGS), int argc)
念ã®ãã説æããã¨ãç¹ç°ã¡ã½ãããã¨ã¯ï¼ãã®ç¹å®ã®ãªãã¸ã§ã¯ ãã«å¯¾ãã¦ã ãæå¹ãªã¡ã½ããã§ãï¼Rubyã§ã¯ããSmalltalkã«ã ããã¯ã©ã¹ã¡ã½ããã¨ãã¦ï¼ã¯ã©ã¹ã«å¯¾ããç¹ç°ã¡ã½ããã使ãã ã¾ãï¼
ãããã®é¢æ°ã® argcã¨ããå¼æ°ã¯Cã®é¢æ°ã¸æ¸¡ãããå¼æ°ã®æ°(㨠形å¼)ã決ãã¾ãï¼argcã0以ä¸ã®æã¯é¢æ°ã«å¼ã渡ãå¼æ°ã®æ°ãæ å³ãã¾ãï¼16å以ä¸ã®å¼æ°ã¯ä½¿ãã¾ãã(ãï¼è¦ãã¾ããããï¼ã ããªã«)ï¼å®éã®é¢æ°ã«ã¯å é ã®å¼æ°ã¨ãã¦selfãä¸ãããã¾ãã® ã§ï¼æå®ããæ°ãã1å¤ãå¼æ°ãæã¤ãã¨ã«ãªãã¾ãï¼
argcãè² ã®æã¯å¼æ°ã®æ°ã§ã¯ãªãï¼å½¢å¼ãæå®ãããã¨ã«ãªãã¾ãï¼ argcã-1ã®æã¯å¼æ°ãé åã«å ¥ãã¦æ¸¡ããã¾ãï¼argcã-2ã®æã¯å¼ æ°ã¯Rubyã®é åã¨ãã¦æ¸¡ããã¾ãï¼
ã¡ã½ãããå®ç¾©ããé¢æ°ã¯ã¾ã ããã¤ãããã¾ã. ã²ã¨ã¤ã¯ã¡ã½ãã åã¨ãã¦IDãåãã¾ã. IDã«ã¤ãã¦ã¯2.2.2ãåç §.
void rb_define_method_id(VALUE klass, ID name, VALUE (*func)(ANYARGS), int argc)
private/protectedãªã¡ã½ãããå®ç¾©ãããµãã¤ã®é¢æ°ãããã¾ã.
void rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc) void rb_define_protected_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc)
privateã¡ã½ããã¨ã¯é¢æ°å½¢å¼ã§ããå¼ã³åºããã¨ã®åºæ¥ãªãã¡ã½ã ãã§ãï¼
æå¾ã«ï¼ rb_define_moduleé¢æ°ã¯ã¢ã¸ã¥ã¼ã«é¢æ°ãå®ç¾©ãã¾ãï¼ ã¢ã¸ã¥ã¼ã«é¢æ°ã¨ã¯ã¢ã¸ã¥ã¼ã«ã®ç¹ç°ã¡ã½ããã§ããï¼åæã« privateã¡ã½ããã§ããããã®ã§ãï¼ä¾ããããã¨Mathã¢ã¸ã¥ã¼ã« ã®sqrt()ãªã©ãããããã¾ãï¼ãã®ã¡ã½ããã¯
Math.sqrt(4)
ã¨ããå½¢å¼ã§ã
include Math sqrt(4)
ã¨ããå½¢å¼ã§ã使ãã¾ãï¼ã¢ã¸ã¥ã¼ã«é¢æ°ãå®ç¾©ããé¢æ°ã¯ä»¥ä¸ã® éãã§ãï¼
void rb_define_module_function(VALUE module, const char *name, VALUE (*func)(ANYARGS), int argc)
é¢æ°çã¡ã½ãã(Kernelã¢ã¸ã¥ã¼ã«ã®private method)ãå®ç¾©ããã ãã®é¢æ°ã¯ä»¥ä¸ã®éãã§ãï¼
void rb_define_global_function(const char *name, VALUE (*func)(ANYARGS), int argc)
ã¡ã½ããã®å¥åãå®ç¾©ããããã®é¢æ°ã¯ä»¥ä¸ã®éãã§ãï¼
void rb_define_alias(VALUE module, const char* new, const char* old);
å±æ§ã®åå¾ã»è¨å®ã¡ã½ãããå®ç¾©ããã«ã¯
void rb_define_attr(VALUE klass, const char *name, int read, int write)
ã¯ã©ã¹ã¡ã½ããallocateãå®ç¾©ãããåé¤ãããããããã®é¢æ°ã¯ 以ä¸ã®éãã§ãï¼
void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass)); void rb_undef_alloc_func(VALUE klass);
funcã¯ã¯ã©ã¹ãå¼æ°ã¨ãã¦åãåã£ã¦ï¼æ°ããå²ãå½ã¦ãããã¤ã³ ã¹ã¿ã³ã¹ãè¿ããªãã¦ã¯ãªãã¾ããï¼ãã®ã¤ã³ã¹ã¿ã³ã¹ã¯ï¼å¤é¨ãª ã½ã¼ã¹ãªã©ãå«ã¾ãªãï¼ã§ããã ãã空ãã®ã¾ã¾ã«ãã¦ãããã»ã ãããã§ãããï¼
ç¶æ¿ããã¯ã©ã¹ã«ããæ¢åã®ã¡ã½ããããªã¼ãã¼ã©ã¤ããã¦ãã㪠ãï¼ãªã¼ãã¼ã©ã¤ããããã¡ã½ãããå¼ã³åºãã«ã¯ä»¥ä¸ã®é¢æ°ã使 ãã¾ãï¼
VALUE rb_call_super(int argc, const VALUE *argv)
ç¾å¨ã®ã¹ã³ã¼ãã®ã¬ã·ã¼ãã¯(ä»ã«æ¹æ³ããªããã°)ï¼ä»¥ä¸ã®é¢æ°ã§ å¾ããã¨ãã§ãã¾ãï¼
VALUE rb_current_receiver(void)
å®æ°å®ç¾©
æ¡å¼µã©ã¤ãã©ãªãå¿ è¦ãªå®æ°ã¯ãããããå®ç¾©ãã¦ãããæ¹ãè¯ã ã§ãããï¼å®æ°ãå®ç¾©ããé¢æ°ã¯äºã¤ããã¾ãï¼
void rb_define_const(VALUE klass, const char *name, VALUE val) void rb_define_global_const(const char *name, VALUE val)
åè ã¯ç¹å®ã®ã¯ã©ã¹/ã¢ã¸ã¥ã¼ã«ã«å±ããå®æ°ãå®ç¾©ãããã®ï¼å¾ è ã¯ã°ãã¼ãã«ãªå®æ°ãå®ç¾©ãããã®ã§ãï¼
Rubyã®æ©è½ãCããå¼ã³åºã
æ¢ã«ã1.5 Rubyã®ãã¼ã¿ãæä½ãããã§ä¸é¨ç´¹ä»ãããããªé¢æ°ã 使ãã°ï¼Rubyã®æ©è½ãå®ç¾ãã¦ããé¢æ°ãç´æ¥å¼ã³åºããã¨ãåºæ¥ ã¾ãï¼
# ãã®ãããªé¢æ°ã®ä¸è¦§è¡¨ã¯ãã¾ã®ã¨ããããã¾ããï¼ã½ã¼ã¹ãè¦ # ããããªãã§ããï¼
ãã以å¤ã«ãRubyã®æ©è½ãå¼ã³åºãæ¹æ³ã¯ããã¤ãããã¾ãï¼
Rubyã®ããã°ã©ã ãevalãã
CããRubyã®æ©è½ãå¼ã³åºããã£ã¨ãç°¡åãªæ¹æ³ã¨ãã¦ï¼æåå㧠ä¸ããããRubyã®ããã°ã©ã ãè©ä¾¡ãã以ä¸ã®é¢æ°ãããã¾ãï¼
VALUE rb_eval_string(const char *str)
ãã®è©ä¾¡ã¯ç¾å¨ã®ç°å¢ã§è¡ããã¾ãï¼ã¤ã¾ãï¼ç¾å¨ã®ãã¼ã«ã«å¤æ° ãªã©ãåãç¶ãã¾ãï¼
è©ä¾¡ã¯ä¾å¤ãçºçãããããããªããã¨ã«æ³¨æãã¾ããã. ããå®å ¨ ãªé¢æ°ãããã¾ã.
VALUE rb_eval_string_protect(const char *str, int *state)
ãã®é¢æ°ã¯ã¨ã©ã¼ãçºçããã¨nilãè¿ãã¾ãï¼ããã¦ï¼æåæã«ã¯ *stateã¯ã¼ãã«ï¼ãããªãã°éã¼ãã«ãªãã¾ãï¼
IDã¾ãã¯ã·ã³ãã«
Cããæååãçµç±ããã«Rubyã®ã¡ã½ãããå¼ã³åºããã¨ãã§ãã¾ ãï¼ãã®åã«ï¼Rubyã¤ã³ã¿ããªã¿å ã§ã¡ã½ãããå¤æ°åãæå®ãã æã«ä½¿ããã¦ããIDã«ã¤ãã¦èª¬æãã¦ããã¾ãããï¼
IDã¨ã¯å¤æ°åï¼ã¡ã½ããåã表ãæ´æ°ã§ãï¼Rubyã®ä¸ã§ã¯
:èå¥å
ã¾ãã¯
:"ä»»æã®æåå"
ã§ã¢ã¯ã»ã¹ã§ãã¾ãï¼Cãããã®æ´æ°ãå¾ãããã«ã¯é¢æ°
rb_intern(const char *name) rb_intern_str(VALUE name)
ã使ãã¾ãï¼Rubyããå¼æ°ã¨ãã¦ä¸ããããã·ã³ãã«(ã¾ãã¯æå å)ãIDã«å¤æããã«ã¯ä»¥ä¸ã®é¢æ°ã使ãã¾ãï¼
rb_to_id(VALUE symbol) rb_check_id(volatile VALUE *name) rb_check_id_cstr(const char *name, long len, rb_encoding *enc)
ããå¼æ°ãã·ã³ãã«ã§ãæååã§ããªããã°ï¼to_strã¡ã½ããã§æ ååã«å¤æãããã¨ãã¾ãï¼ç¬¬äºã®é¢æ°ã¯ãã®å¤æçµæã*nameã«ä¿ åã,ãã®ååãæ¢ç¥ã®ã·ã³ãã«ã§ãªãå ´åã¯0ãè¿ãã¾ãï¼ãã®é¢ æ°ã0以å¤ãè¿ããå ´åã¯*nameã¯å¸¸ã«ã·ã³ãã«ãæååã§ããï¼0ã è¿ããå ´åã¯å¸¸ã«æååã§ãï¼ç¬¬ä¸ã®é¢æ°ã¯Rubyã®æååã§ã¯ãªã NULçµç«¯ãããCã®æååã使ãã¾ãï¼
Rubyããå¼æ°ã¨ãã¦ä¸ããããã·ã³ãã«(ã¾ãã¯æåå)ãã·ã³ãã« ã«å¤æããã«ã¯ä»¥ä¸ã®é¢æ°ã使ãã¾ãï¼
rb_to_symbol(VALUE name) rb_check_symbol(volatile VALUE *namep) rb_check_symbol_cstr(const char *ptr, long len, rb_encoding *enc)
ãããã®é¢æ°ã¯ï¼IDã®ä»£ããã«ã·ã³ãã«ãè¿ããã¨ãé¤ãã°ä¸è¨ã® é¢æ°ã¨åãã§ãï¼
CããRubyã®ã¡ã½ãããå¼ã³åºã
Cããæååãçµç±ããã«Rubyã®ã¡ã½ãããå¼ã³åºãããã«ã¯ä»¥ä¸ ã®é¢æ°ã使ãã¾ãï¼
VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)
ãã®é¢æ°ã¯ãªãã¸ã§ã¯ãrecvã®midã§æå®ãããã¡ã½ãããå¼ã³åº ãã¾ãï¼ãã®ä»ã«å¼æ°ã®æå®ã®ä»æ¹ãéã以ä¸ã®é¢æ°ãããã¾ãï¼
VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv) VALUE rb_apply(VALUE recv, ID mid, VALUE args)
applyã«ã¯å¼æ°ã¨ãã¦Rubyã®é åãä¸ãã¾ãï¼
å¤æ°/å®æ°ãåç §/æ´æ°ãã
Cããé¢æ°ã使ã£ã¦åç §ã»æ´æ°ã§ããã®ã¯ï¼å®æ°ï¼ã¤ã³ã¹ã¿ã³ã¹å¤ æ°ã§ãï¼å¤§åå¤æ°ã¯ä¸é¨ã®ãã®ã¯Cã®å¤§åå¤æ°ã¨ãã¦ã¢ã¯ã»ã¹ã§ã ã¾ãï¼ãã¼ã«ã«å¤æ°ãåç §ããæ¹æ³ã¯å ¬éãã¦ãã¾ããï¼
ãªãã¸ã§ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãåç §ã»æ´æ°ããé¢æ°ã¯ä»¥ä¸ã®é ãã§ãï¼
VALUE rb_ivar_get(VALUE obj, ID id) VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)
idã¯rb_intern()ã§å¾ããããã®ã使ã£ã¦ãã ããï¼
å®æ°ãåç §ããã«ã¯ä»¥ä¸ã®é¢æ°ã使ã£ã¦ãã ããï¼
VALUE rb_const_get(VALUE obj, ID id)
å®æ°ãæ°ããå®ç¾©ããããã«ã¯ã2.1.3 å®æ°å®ç¾©ãã§ç´¹ä»ã ãã¦ããé¢æ°ã使ã£ã¦ãã ããï¼
Rubyã¨Cã¨ã®æ å ±å ±æ
Cè¨èªã¨Rubyã®éã§æ å ±ãå ±æããæ¹æ³ã«ã¤ãã¦è§£èª¬ãã¾ãï¼
Cããåç §ã§ããRubyã®å®æ°
以ä¸ã®Rubyã®å®æ°ã¯Cã®ã¬ãã«ããåç §ã§ãã¾ãï¼
Qtrue |
|
Qfalse |
çå½å¤ï¼Qfalseã¯Cè¨èªã§ãå½ã¨ã¿ãªããã¾ã(ã¤ã¾ã0)ï¼ |
Qnil |
Cè¨èªããè¦ããnilãï¼ |
Cã¨Rubyã§å ±æããã大åå¤æ°
Cã¨Rubyã§å¤§åå¤æ°ã使ã£ã¦æ å ±ãå ±æã§ãã¾ãï¼å ±æã§ãã大å å¤æ°ã«ã¯ããã¤ãã®ç¨®é¡ãããã¾ãï¼ãã®ãªãã§ãã£ã¨ãè¯ã使ã ããã¨æãããã®ã¯rb_define_variable()ã§ãï¼
void rb_define_variable(const char *name, VALUE *var)
ãã®é¢æ°ã¯Rubyã¨Cã¨ã§å ±æãã大åå¤æ°ãå®ç¾©ãã¾ãï¼å¤æ°åã `$‘ã§å§ã¾ããªãæã«ã¯èªåçã«è¿½å ããã¾ãï¼ãã®å¤æ°ã®å¤ãå¤ æ´ããã¨èªåçã«Rubyã®å¯¾å¿ããå¤æ°ã®å¤ãå¤ããã¾ãï¼
ã¾ãRubyå´ããã¯æ´æ°ã§ããªãå¤æ°ãããã¾ãï¼ãã®read onlyã® å¤æ°ã¯ä»¥ä¸ã®é¢æ°ã§å®ç¾©ãã¾ãï¼
void rb_define_readonly_variable(const char *name, VALUE *var)
ãããå¤æ°ã®ä»ã«hookãã¤ãã大åå¤æ°ãå®ç¾©ã§ãã¾ãï¼hookä»ã ã®å¤§åå¤æ°ã¯ä»¥ä¸ã®é¢æ°ãç¨ãã¦å®ç¾©ãã¾ãï¼hookä»ã大åå¤æ°ã® å¤ã®åç §ãè¨å®ã¯hookã§è¡ãå¿ è¦ãããã¾ãï¼
void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)())
ãã®é¢æ°ã¯Cã®é¢æ°ã«ãã£ã¦hookã®ã¤ãããã大åå¤æ°ãå®ç¾©ãã¾ ãï¼å¤æ°ãåç §ãããæã«ã¯é¢æ°getterãï¼å¤æ°ã«å¤ãã»ãããã ãæã«ã¯é¢æ°setterãå¼ã°ããï¼hookãæå®ããªãå ´åã¯getterã setterã«0ãæå®ãã¾ãï¼
getterã¨setterã®ä»æ§ã¯æ¬¡ã®éãã§ãï¼
VALUE (*getter)(ID id, VALUE *var); void (*setter)(VALUE val, ID id, VALUE *var);
ããããï¼å¯¾å¿ããCã®å¤æ°ãæããªãRubyã®å¤§åå¤æ°ãå®ç¾©ãã ãã¨ãã§ãã¾ã. ãã®å¤æ°ã®å¤ã¯ããã¯é¢æ°ã®ã¿ã«ãã£ã¦åå¾ã»è¨å® ããã¾ã.
void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)())
ãã®é¢æ°ã«ãã£ã¦å®ç¾©ãããRubyã®å¤§åå¤æ°ãåç §ãããæã«ã¯ getterãï¼å¤æ°ã«å¤ãã»ãããããæã«ã¯setterãå¼ã°ãã¾ãï¼
getterã¨setterã®ä»æ§ã¯ä»¥ä¸ã®éãã§ãï¼
(*getter)(ID id); (*setter)(VALUE val, ID id);
Cã®ãã¼ã¿ãRubyãªãã¸ã§ã¯ãã«ãã
Cã®ä¸çã§å®ç¾©ããããã¼ã¿(æ§é ä½)ãRubyã®ãªãã¸ã§ã¯ãã¨ã㦠åãæ±ãããå ´åããããã¾ãï¼ãã®ãããªå ´åã¯TypedData_XXX ãã¯ã群ãç¨ãã¦æ§é ä½ã¸ã®ãã¤ã³ã¿ã¨Rubyã®ãªãã¸ã§ã¯ãã¨ãäº ãã«å¤æã§ãã¾ãï¼
æ§é ä½ãããªãã¸ã§ã¯ãã¸
æ§é ä½ã¸ã®ãã¤ã³ã¿svalãRubyãªãã¸ã§ã¯ãã«å¤æããã«ã¯æ¬¡ã®ã ã¯ãã使ãã¾ãã
TypedData_Wrap_Struct(klass, data_type, sval)
ãã®ãã¯ãã®æ»ãå¤ã¯çæããããªãã¸ã§ã¯ãã表ãVALUEå¤ã§ãï¼
klassã¯ãã®ãªãã¸ã§ã¯ãã®ã¯ã©ã¹ã§ãï¼data_typeã¯ãã®æ§é ä½ã Rubyã管çããããã®æ å ±ãè¨è¿°ããconst rb_data_type_tåã¸ã® ãã¤ã³ã¿ã§ãï¼
ãªã, klassã¯, Objectãä»ã®ã¯ã©ã¹ã§ã¯ãªãData (rb_cData)ã¨ã ãç¹å¥ãªã¯ã©ã¹ããæ´¾çãããã¨ãæ¨å¥¨ããã¾ãï¼ Dataããæ´¾çããªãå ´åã«ã¯, å¿ ãrb_undef_alloc_func(klass) ãå¼ã³åºãã¦ãã ããï¼
rb_data_type_tã¯æ¬¡ã®ããã«å®ç¾©ããã¦ãã¾ãï¼
typedef struct rb_data_type_struct rb_data_type_t; struct rb_data_type_struct { const char *wrap_struct_name; struct { void (*dmark)(void*); void (*dfree)(void*); size_t (*dsize)(const void *); void *reserved[2]; } function; const rb_data_type_t *parent; void *data; VALUE flags; };
wrap_struct_nameã¯ãã®æ§é ä½ãèå¥ããååã§ãï¼ä¸»ã«çµ±è¨æ å ± ã®åéã¨åºåã«ç¨ãããã¾ãï¼ããã»ã¹å ã§ä¸æã§ããã°ç¹ã«Cã Rubyã®èå¥åã¨ãã¦æå¹ã§ããå¿ è¦ã¯ããã¾ããï¼
dmarkããã³dfreeé¢æ°ã¯GCå®è¡ä¸ã«å¼ã³åºããã¾ã. ãªã, GCå®è¡ä¸ã¯Rubyãªãã¸ã§ã¯ãã®ã¢ãã±ã¼ã·ã§ã³ã¯ç¦æ¢ããã¾ ã. ãã£ã¦, dmarkããã³dfreeé¢æ°ã§Rubyãªãã¸ã§ã¯ãã®ã¢ãã±ã¼ ã·ã§ã³ã¯è¡ããªãã§ãã ãã.
dmarkã¯ã¬ã¼ãã¼ã¸ã³ã¬ã¯ã¿ããªãã¸ã§ã¯ãã¸ã®åç §ããã¼ã¯ãã ã¨ãã«ç¨ããé¢æ°ã§ãï¼ãã®æ§é ä½ãRubyã®ãªãã¸ã§ã¯ãã¸ã®åç § ãä¿æããã¨ãã«ã¯, dmarkã§ã¯rb_gc_markãªã©ãç¨ãã¦æ§é ä½å ã®ãã¹ã¦ã®åç §ããã¼ã¯ããªããã°ãªãã¾ããï¼ ãã®ãããªåç §ãå«ã¾ãªãæã«ã¯0ãæå®ãã¾ãï¼
dfreeã¯ãã®æ§é ä½ãããä¸è¦ã«ãªã£ãæã«å¼ã°ããé¢æ°ã§ãï¼ã ã®é¢æ°ãã¬ã¼ãã¼ã¸ã³ã¬ã¯ã¿ããå¼ã°ãã¾ãï¼ããã-1ã®å ´åã¯ï¼ åç´ã«æ§é ä½ã解æ¾ããã¾ãï¼
dsizeã¯æ§é ä½ãæ¶è²»ãã¦ããã¡ã¢ãªã®ãã¤ãæ°ãè¿ãé¢æ°ã§ãï¼ å¼æ°ã¨ãã¦æ§é ä½ã¸ã®ãã¤ã³ã¿ã渡ããã¾ãï¼å®è£ å°é£ã§ããã°0 ã渡ãã¦ãå·®ãæ¯ãããã¾ããã, ã§ããã ãæå®ããããã«ã㦠ãã ããï¼
reservedã¨parentã¯0ã§åããªããã°ãªãã¾ããï¼
dataã«ã¯ã¦ã¼ã¶ã¼å®ç¾©ã®ä»»æã®å¤ãæå®ã§ãã¾ãï¼Rubyã¯ãã®å¤ã« ã¯é¢ç¥ããªãã®ã§ï¼å¥½ãã«ä½¿ã£ã¦ãã ããï¼
flagsã«ã¯æ¬¡ã®ãã©ã°ã®ãã¡å½ã¦ã¯ã¾ããã®ã®ãããåãæå®ãã¾ ãï¼ããããRubyã®ã¬ã¼ãã¼ã¸ã³ã¬ã¯ã¿ã«ã¤ãã¦ã®æ·±ãç解ãå¿ è¦ ã¨ãã¾ãã®ã§ï¼è¯ãããããªãå ´åã«ã¯0ãæå®ããã¨è¯ãã§ãã ãï¼
RUBY_TYPED_FREE_IMMEDIATELY |
ãã®ãã©ã°ãæå®ããã¨ï¼ã¬ã¼ãã¼ã¸ã³ã¬ã¯ã¿ã¯ãã®æ§é ä½ãä¸ è¦ã«ãªã£ãå ´åã«ã¯GCä¸ã«ç´ã¡ã«dfreeãå¼ã³åºãã¾ãï¼ dfreeãRubyå é¨ã®ããã¯(GVL)ã解æ¾ããå¯è½æ§ããªãå ´åã¯ã ã®ãã©ã°ãæå®ã§ãã¾ãï¼ æå®ããªãå ´åã¯dfreeå¼ã³åºãã¯é 延ãã, ãã¡ã¤ãã©ã¤ã¶ã¨ åãã¿ã¤ãã³ã°ã§å®è¡ããã¾ãï¼ |
RUBY_TYPED_WB_PROTECTED |
ãªãã¸ã§ã¯ãã®å®è£ ãã©ã¤ãããªã¢ããµãã¼ããã¦ãããã¨ã示 ãã¾ãï¼ãã®ãã©ã°ãæå®ããã¨Rubyã¯ãã®ãªãã¸ã§ã¯ãã«å¯¾ã ã¦GCãããå¹ççã«å®è¡ã§ãã¾ãï¼ ãã ãï¼æå®ããå ´åã¯ã¦ã¼ã¶ã¼ã¯ãã®ãªãã¸ã§ã¯ãã®ãã¹ã¦ã® ã¡ã½ããã®å®è£ ã«é©åã«ã©ã¤ãããªã¢ãæ¿å ¥ãã責任ãããã¾ãï¼ ãããªãã°Rubyã¯å®è¡æã«ã¯ã©ãã·ã¥ããå¯è½æ§ãããã¾ãï¼ ã©ã¤ãããªã¢ã«ã¤ãã¦ã¯doc/extension.ja.rdocã®Appendix D “ä¸ä»£å¥GC”ãåç §ãã¦ãã ããï¼ |
Cã®æ§é ä½ã®å²å½ã¨å¯¾å¿ãããªãã¸ã§ã¯ãã®çæãåæã«è¡ãã㯠ãã¨ãã¦ä»¥ä¸ã®ãã®ãæä¾ããã¦ãã¾ãï¼
TypedData_Make_Struct(klass, type, data_type, sval)
ãã®ãã¯ãã®æ»ãå¤ã¯çæããããªãã¸ã§ã¯ãã®VALUEå¤ ã§ãï¼ãã®ãã¯ãã¯ä»¥ä¸ã®å¼ã®ããã«åãã¾ã:
(sval = ZALLOC(type), TypedData_Wrap_Struct(klass, data_type, sval))
klass, data_typeã¯Data_Wrap_Structã¨åãåãããã¾ãï¼type ã¯å²ãå½ã¦ãCæ§é ä½ã®åã§ãï¼å²ãå½ã¦ãããæ§é ä½ã¯å¤æ°sval ã«ä»£å ¥ããã¾ãï¼ãã®å¤æ°ã®å㯠(type*) ã§ããå¿ è¦ãããã¾ãï¼
ãªãã¸ã§ã¯ãããæ§é ä½ã¸
TypedData_Wrap_StructãTypedData_Make_Structã§çæãããªãã¸ã§ ã¯ãããæ§é ä½ã¸ã®ãã¤ã³ã¿ã復å ããã«ã¯ä»¥ä¸ã®ãã¯ããç¨ãã¾ ãï¼
TypedData_Get_Struct(obj, type, &data_type, sval)
Cã®æ§é ä½ã¸ã®ãã¤ã³ã¿ã¯å¤æ°svalã«ä»£å ¥ããã¾ãï¼
ãããã®ãã¯ãã®ä½¿ãæ¹ã¯ã¡ãã£ã¨åããã«ããã®ã§ï¼å¾ã§èª¬æã ãä¾é¡ãåç §ãã¦ãã ããï¼
ä¾: dbmã®æ¡å¼µã©ã¤ãã©ãªã®ä½æ
ãã£ã¬ã¯ããªãä½ã
% mkdir ext/dbm
Ruby 1.1ããã¯ä»»æã®ãã£ã¬ã¯ããªã§ãã¤ãããã¯ã©ã¤ãã©ãªãä½ ããã¨ãã§ããããã«ãªãã¾ããï¼Rubyã«éçã«ãªã³ã¯ããå ´åã« ã¯Rubyãå±éãããã£ã¬ã¯ããªã®ä¸ï¼extãã£ã¬ã¯ããªã®ä¸ã«æ¡å¼µ ã©ã¤ãã©ãªç¨ã®ãã£ã¬ã¯ããªãä½ãå¿ è¦ãããã¾ãï¼ååã¯é©å½ã« é¸ãã§æ§ãã¾ããï¼
è¨è¨ãã
ã¾ãï¼å½ç¶ãªãã§ããã©ï¼ã©ãããæ©è½ãå®ç¾ãããã©ããã¾ãè¨ è¨ããå¿ è¦ãããã¾ãï¼ã©ããªã¯ã©ã¹ãã¤ãããï¼ãã®ã¯ã©ã¹ã«ã¯ ã©ããªã¡ã½ããããããï¼ã¯ã©ã¹ãæä¾ããå®æ°ãªã©ã«ã¤ãã¦è¨è¨ ãã¾ãï¼
Cã³ã¼ããæ¸ã
æ¡å¼µã©ã¤ãã©ãªæ¬ä½ã¨ãªãCè¨èªã®ã½ã¼ã¹ãæ¸ãã¾ãï¼Cè¨èªã®ã½ã¼ ã¹ãã²ã¨ã¤ã®æã«ã¯ãã©ã¤ãã©ãªå.cããé¸ã¶ã¨è¯ãã§ãããï¼C è¨èªã®ã½ã¼ã¹ãè¤æ°ã®å ´åã«ã¯éã«ãã©ã¤ãã©ãªå.cãã¨ãããã¡ ã¤ã«åã¯é¿ããå¿ è¦ãããã¾ãï¼ãªãã¸ã§ã¯ããã¡ã¤ã«ã¨ã¢ã¸ã¥ã¼ ã«çææã«ä¸éçã«çæããããã©ã¤ãã©ãªå.oãã¨ãããã¡ã¤ã« ã¨ãè¡çªããããã§ãï¼ã¾ãï¼å¾è¿°ãã mkmf ã©ã¤ãã©ãªã®ãã㤠ãã®é¢æ°ãã³ã³ãã¤ã«ãè¦ãããã¹ãã®ããã«ãconftest.cãã¨ã ããã¡ã¤ã«åã使ç¨ãããã¨ã«æ³¨æãã¦ãã ããï¼ã½ã¼ã¹ãã¡ã¤ã« åã¨ãã¦ãconftest.cãã使ç¨ãã¦ã¯ãªãã¾ããï¼
Rubyã¯æ¡å¼µã©ã¤ãã©ãªããã¼ãããæã«ãInit_ã©ã¤ãã©ãªåã㨠ããé¢æ°ãèªåçã«å®è¡ãã¾ãï¼dbmã©ã¤ãã©ãªã®å ´åãInit_dbmã ã§ãï¼ãã®é¢æ°ã®ä¸ã§ã¯ã©ã¹ï¼ã¢ã¸ã¥ã¼ã«ï¼ã¡ã½ããï¼å®æ°ãªã©ã® å®ç¾©ãè¡ãã¾ãï¼dbm.cããä¸é¨å¼ç¨ãã¾ãï¼
void Init_dbm(void) { /* DBMã¯ã©ã¹ãå®ç¾©ãã */ VALUE cDBM = rb_define_class("DBM", rb_cObject); /* DBMã¯Enumerableã¢ã¸ã¥ã¼ã«ãã¤ã³ã¯ã«ã¼ããã */ rb_include_module(cDBM, rb_mEnumerable); /* DBMã¯ã©ã¹ã®ã¯ã©ã¹ã¡ã½ããopen(): å¼æ°ã¯Cã®é åã§åãã */ rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1); /* DBMã¯ã©ã¹ã®ã¡ã½ããclose(): å¼æ°ã¯ãªã */ rb_define_method(cDBM, "close", fdbm_close, 0); /* DBMã¯ã©ã¹ã®ã¡ã½ãã[]: å¼æ°ã¯1å */ rb_define_method(cDBM, "[]", fdbm_fetch, 1); /* ... */ /* DBMãã¼ã¿ãæ ¼ç´ããã¤ã³ã¹ã¿ã³ã¹å¤æ°åã®ããã®ID */ id_dbm = rb_intern("dbm"); }
DBMã©ã¤ãã©ãªã¯dbmã®ãã¼ã¿ã¨å¯¾å¿ãããªãã¸ã§ã¯ãã«ãªãã¯ã㧠ãããï¼Cã®ä¸çã®dbmãRubyã®ä¸çã«åãè¾¼ãå¿ è¦ãããã¾ãï¼
dbm.cã§ã¯TypedData_Make_Structã以ä¸ã®ããã«ä½¿ã£ã¦ãã¾ãï¼
struct dbmdata { int di_size; DBM *di_dbm; }; static const rb_data_type_t dbm_type = { "dbm", {0, free_dbm, memsize_dbm,}, 0, 0, RUBY_TYPED_FREE_IMMEDIATELY, }; obj = TypedData_Make_Struct(klass, struct dbmdata, &dbm_type, dbmp);
ããã§ã¯dbmdataæ§é ä½ã¸ã®ãã¤ã³ã¿ãDataã«ã«ãã»ã«åãã¦ã ã¾ãï¼DBM*ãç´æ¥ã«ãã»ã«åããªãã®ã¯close()ããæã®å¦çãè ãã¦ã®ãã¨ã§ãï¼
Dataãªãã¸ã§ã¯ãããdbmstructæ§é ä½ã®ãã¤ã³ã¿ãåãåºããã ã«ä»¥ä¸ã®ãã¯ãã使ã£ã¦ãã¾ãï¼
#define GetDBM(obj, dbmp) do {\ TypedData_Get_Struct((obj), struct dbmdata, &dbm_type, (dbmp));\ if ((dbmp) == 0) closed_dbm();\ if ((dbmp)->di_dbm == 0) closed_dbm();\ } while (0)
ã¡ãã£ã¨è¤éãªãã¯ãã§ããï¼è¦ããã«dbmdataæ§é ä½ã®ãã¤ã³ã¿ ã®åãåºãã¨ï¼closeããã¦ãããã©ããã®ãã§ãã¯ãã¾ã¨ãã¦ã ãã ãã§ãï¼
DBMã¯ã©ã¹ã«ã¯ããããã¡ã½ãããããã¾ããï¼åé¡ããã¨3種é¡ã® å¼æ°ã®åãæ¹ãããã¾ãï¼ã²ã¨ã¤ã¯å¼æ°ã®æ°ãåºå®ã®ãã®ã§ï¼ä¾ã¨ ãã¦ã¯deleteã¡ã½ãããããã¾ãï¼deleteã¡ã½ãããå®è£ ãã¦ãã fdbm_delete()ã¯ãã®ããã«ãªã£ã¦ãã¾ãï¼
static VALUE fdbm_delete(VALUE obj, VALUE keystr) { /* ... */ }
å¼æ°ã®æ°ãåºå®ã®ã¿ã¤ãã¯ç¬¬1å¼æ°ãselfï¼ç¬¬2å¼æ°ä»¥éãã¡ã½ãã ã®å¼æ°ã¨ãªãã¾ãï¼
å¼æ°ã®æ°ãä¸å®ã®ãã®ã¯Cã®é åã§åãããã®ã¨Rubyã®é åã§åã ããã®ã¨ãããã¾ãï¼dbmã©ã¤ãã©ãªã®ä¸ã§ï¼Cã®é åã§åãããã® ã¯DBMã®ã¯ã©ã¹ã¡ã½ããã§ããopen()ã§ãï¼ãããå®è£ ãã¦ããé¢ æ°fdbm_s_open()ã¯ãããªã£ã¦ãã¾ãï¼
static VALUE fdbm_s_open(int argc, VALUE *argv, VALUE klass) { /* ... */ if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) { mode = 0666; /* default value */ } /* ... */ }
ãã®ã¿ã¤ãã®é¢æ°ã¯ç¬¬1å¼æ°ãä¸ããããå¼æ°ã®æ°ï¼ç¬¬2å¼æ°ãä¸ã ãããå¼æ°ã®å ¥ã£ã¦ããé åã«ãªãã¾ãï¼selfã¯ç¬¬3å¼æ°ã¨ãã¦ä¸ ãããã¾ãï¼
ãã®é åã§ä¸ããããå¼æ°ã解æããããã®é¢æ°ãopen()ã§ã使ã ãã¦ããrb_scan_args()ã§ãï¼ç¬¬3å¼æ°ã«æå®ãããã©ã¼ãããã«å¾ ãï¼ç¬¬4å¼æ°ä»¥éã«æå®ããVALUEã¸ã®åç §ã«å¤ãä»£å ¥ãã¦ããã¾ ãï¼
å¼æ°ã®æ°ããã§ãã¯ããã ããªãrb_check_arity()ã使ãã¾ãï¼ ããã¯å¼æ°ããªã¹ãã¨ãã¦æ±ãããã¨ãã«ä¾¿å©ã§ãï¼
å¼æ°ãRubyã®é åã¨ãã¦åãåãã¡ã½ããã®ä¾ã«ã¯ Thread#initializeãããã¾ãï¼å®è£ ã¯ããã§ãï¼
static VALUE thread_initialize(VALUE thread, VALUE args) { /* ... */ }
第1å¼æ°ã¯selfï¼ç¬¬2å¼æ°ã¯Rubyã®é åã§ãï¼
注æäºé
Rubyã¨å ±æã¯ããªããRubyã®ãªãã¸ã§ã¯ããæ ¼ç´ããå¯è½æ§ã®ãã Cã®å¤§åå¤æ°ã¯ä»¥ä¸ã®é¢æ°ã使ã£ã¦Rubyã¤ã³ã¿ããªã¿ã«å¤æ°ã®åå¨ ãæãã¦ããã¦ãã ããï¼ã§ãªãã¨GCã§ãã©ãã«ãèµ·ããã¾ãï¼
void rb_global_variable(VALUE *var)
extconf.rbãç¨æãã
Makefileãä½ãå ´åã®éåã«ãªãextconf.rbã¨ãããã¡ã¤ã«ãä½ã ã¾ãï¼extconf.rbã¯ã©ã¤ãã©ãªã®ã³ã³ãã¤ã«ã«å¿ è¦ãªæ¡ä»¶ã®ãã§ã ã¯ãªã©ãè¡ããã¨ãç®çã§ãï¼ã¾ãï¼
require 'mkmf'
ãextconf.rbã®å é ã«ç½®ãã¾ãï¼extconf.rbã®ä¸ã§ã¯ä»¥ä¸ã®Rubyé¢ æ°ã使ããã¨ãåºæ¥ã¾ãï¼
have_library(lib, func): ã©ã¤ãã©ãªã®åå¨ãã§ã㯠have_func(func, header): é¢æ°ã®åå¨ãã§ã㯠have_header(header): ããããã¡ã¤ã«ã®åå¨ãã§ã㯠create_makefile(target[, target_prefix]): Makefileã®çæ
以ä¸ã®å¤æ°ã使ããã¨ãã§ãã¾ãï¼
$CFLAGS: ã³ã³ãã¤ã«æã«è¿½å çã«æå®ãããã©ã°(-Oãªã©) $CPPFLAGS: ããªããã»ããµã«è¿½å çã«æå®ãããã©ã°(-Iã-Dãªã©) $LDFLAGS: ãªã³ã¯æã«è¿½å çã«æå®ãããã©ã°(-Lãªã©) $objs: ãªã³ã¯ããããªãã¸ã§ã¯ããã¡ã¤ã«åã®ãªã¹ã
ãªãã¸ã§ã¯ããã¡ã¤ã«ã®ãªã¹ãã¯ï¼é常ã¯ã½ã¼ã¹ãã¡ã¤ã«ãæ¤ç´¢ã ã¦èªåçã«çæããã¾ããï¼makeã®éä¸ã§ã½ã¼ã¹ãçæãããããª å ´åã¯æ示çã«æå®ããå¿ è¦ãããã¾ãï¼
ã©ã¤ãã©ãªãã³ã³ãã¤ã«ããæ¡ä»¶ãæããï¼ãã®ã©ã¤ãã©ãªãã³ã³ ãã¤ã«ããªãæã«ã¯create_makefileãå¼ã°ãªããã°Makefileã¯ç æãããï¼ã³ã³ãã¤ã«ãè¡ããã¾ããï¼
dependãç¨æãã
ããï¼ãã£ã¬ã¯ããªã«dependã¨ãããã¡ã¤ã«ãåå¨ããã°ï¼ Makefileãä¾åé¢ä¿ããã§ãã¯ãã¦ããã¾ãï¼
% gcc -MM *.c > depend
ãªã©ã§ä½ããã¨ãåºæ¥ã¾ãï¼ãã£ã¦æã¯ç¡ãã§ãããï¼
Makefileãçæãã
Makefileãå®éã«çæããããã«ã¯
ruby extconf.rb
ã¨ãã¾ãï¼extconf.rbã« require ‘mkmf’ ã®è¡ããªãå ´åã«ã¯ã¨ã©ã¼ ã«ãªãã¾ãã®ã§ï¼å¼æ°ã追å ãã¦
ruby -r mkmf extconf.rb
ã¨ãã¦ãã ããï¼
site_ruby ãã£ã¬ã¯ããªã§ãªãï¼ vendor_ruby ãã£ã¬ã¯ããªã«ã¤ã³ã¹ãã¼ã«ããå ´åã«ã¯ 以ä¸ã®ããã« –vendor ãªãã·ã§ã³ãå ãã¦ãã ããï¼
ruby extconf.rb --vendor
ãã£ã¬ã¯ããªãext以ä¸ã«ç¨æããå ´åã«ã¯Rubyå ¨ä½ã®makeã®æã« èªåçã«Makefileãçæããã¾ãã®ã§ï¼ãã®ã¹ãããã¯ä¸è¦ã§ãï¼
makeãã
åçãªã³ã¯ã©ã¤ãã©ãªãçæããå ´åã«ã¯ãã®å ´ã§makeãã¦ãã ã ãï¼å¿ è¦ã§ããã° make install ã§ã¤ã³ã¹ãã¼ã«ããã¾ãï¼
ext以ä¸ã«ãã£ã¬ã¯ããªãç¨æããå ´åã¯ï¼Rubyã®ãã£ã¬ã¯ããªã§ makeãå®è¡ããã¨Makefileãçæããmakeï¼å¿ è¦ã«ãã£ã¦ã¯ãã®ã¢ ã¸ã¥ã¼ã«ã®Rubyã¸ã®ãªã³ã¯ã¾ã§èªåçã«å®è¡ãã¦ããã¾ãï¼ extconf.rbãæ¸ãæãããªã©ãã¦Makefileã®åçæãå¿ è¦ãªæã¯ã¾ ãRubyãã£ã¬ã¯ããªã§makeãã¦ãã ããï¼
æ¡å¼µã©ã¤ãã©ãªã¯make installã§Rubyã©ã¤ãã©ãªã®ãã£ã¬ã¯ããªã® ä¸ã«ã³ãã¼ããã¾ãï¼ããæ¡å¼µã©ã¤ãã©ãªã¨å調ãã¦ä½¿ãRubyã§è¨ è¿°ãããããã°ã©ã ãããï¼Rubyã©ã¤ãã©ãªã«ç½®ãããå ´åã«ã¯ï¼ æ¡å¼µã©ã¤ãã©ãªç¨ã®ãã£ã¬ã¯ããªã®ä¸ã« lib ã¨ãããã£ã¬ã¯ã㪠ãä½ãï¼ããã« æ¡å¼µå .rb ã®ãã¡ã¤ã«ãç½®ãã¦ããã°åæã«ã¤ã³ ã¹ãã¼ã«ããã¾ãï¼
ãããã°
ã¾ãï¼ãããã°ããªãã¨åããªãã§ããããï¼ext/Setupã«ãã£ã¬ ã¯ããªåãæ¸ãã¨éçã«ãªã³ã¯ããã®ã§ãããã¬ã使ããããã«ãª ãã¾ãï¼ãã®åã³ã³ãã¤ã«ãé ããªãã¾ããã©ï¼
ã§ãããã
å¾ã¯ãã£ãã使ããªãï¼åºãå ¬éãããªãï¼å£²ããªãï¼ãèªç±ã«ã 使ããã ããï¼Rubyã®ä½è ã¯æ¡å¼µã©ã¤ãã©ãªã«é¢ãã¦ä¸åã®æ¨©å©ã 主張ãã¾ããï¼
Appendix A. Rubyã®ã½ã¼ã¹ã³ã¼ãã®åé¡
Rubyã®ã½ã¼ã¹ã¯ããã¤ãã«åé¡ãããã¨ãåºæ¥ã¾ãï¼ãã®ãã¡ã¯ã© ã¹ã©ã¤ãã©ãªã®é¨åã¯åºæ¬çã«æ¡å¼µã©ã¤ãã©ãªã¨åãä½ãæ¹ã«ãªã£ ã¦ãã¾ãï¼ãããã®ã½ã¼ã¹ã¯ä»ã¾ã§ã®èª¬æã§ã»ã¨ãã©ç解ã§ãã㨠æãã¾ãï¼
Rubyè¨èªã®ã³ã¢
class.c |
ã¯ã©ã¹ã¨ã¢ã¸ã¥ã¼ã« |
error.c |
ä¾å¤ã¯ã©ã¹ã¨ä¾å¤æ©æ§ |
gc.c |
è¨æ¶é å管ç |
load.c |
ã©ã¤ãã©ãªã®ãã¼ã |
object.c |
ãªãã¸ã§ã¯ã |
variable.c |
å¤æ°ã¨å®æ° |
Rubyã®æ§æ解æå¨
parse.y |
åå¥è§£æå¨ã¨æ§æå®ç¾© |
parse.c |
èªåçæ |
defs/keywords |
äºç´èª |
lex.c |
èªåçæ |
Rubyã®è©ä¾¡å¨ (é称YARV)
compile.c eval.c eval_error.c eval_jump.c eval_safe.c insns.def : ä»®æ³æ©æ¢°èªã®å®ç¾© iseq.c : VM::ISeqã®å®è£ thread.c : ã¹ã¬ãã管çã¨ã³ã³ããã¹ãåãæ¿ã thread_win32.c : ã¹ã¬ããå®è£ thread_pthread.c : åä¸ vm.c vm_dump.c vm_eval.c vm_exec.c vm_insnhelper.c vm_method.c defs/opt_insns_unif.def : å½ä»¤èå defs/opt_operand.def : æé©åã®ããã®å®ç¾© -> insn*.inc : èªåçæ -> opt*.inc : èªåçæ -> vm.inc : èªåçæ
æ£è¦è¡¨ç¾ã¨ã³ã¸ã³ (鬼è»)
regex.c regcomp.c regenc.c regerror.c regexec.c regparse.c regsyntax.c
ã¦ã¼ãã£ãªãã£é¢æ°
debug.c |
Cãããã¬ç¨ã®ãããã°ã·ã³ãã« |
dln.c |
åçãã¼ãã£ã³ã° |
st.c |
æ±ç¨ããã·ã¥è¡¨ |
strftime.c |
æå»æ´å½¢ |
util.c |
ãã®ä»ã®ã¦ã¼ãã£ãªã㣠|
Rubyã³ãã³ãã®å®è£
dmyext.c dmydln.c dmyencoding.c id.c inits.c main.c ruby.c version.c gem_prelude.rb prelude.rb
ã¯ã©ã¹ã©ã¤ãã©ãª
array.c |
|
bignum.c |
|
compar.c |
|
complex.c |
|
cont.c |
|
dir.c |
|
enum.c |
|
enumerator.c |
|
file.c |
|
hash.c |
|
io.c |
|
marshal.c |
|
math.c |
|
numeric.c |
|
pack.c |
Array#pack, String#unpack |
proc.c |
|
process.c |
|
random.c |
ä¹±æ° |
range.c |
|
rational.c |
|
re.c |
|
signal.c |
|
sprintf.c |
String#sprintf |
string.c |
|
struct.c |
|
time.c |
|
defs/known_errors.def |
ä¾å¤ã¯ã©ã¹ Errno::* |
-> known_errors.inc |
èªåçæ |
å¤è¨èªå
encoding.c |
|
transcode.c |
|
enc/*.c |
ã¨ã³ã³ã¼ãã£ã³ã°ã¯ã©ã¹ç¾¤ |
enc/trans/* |
ã³ã¼ããã¤ã³ã対å¿è¡¨ |
gorubyã³ãã³ãã®å®è£
goruby.c golf_prelude.rb : gorubyåºæã®ã©ã¤ãã©ãª -> golf_prelude.c : èªåçæ
Appendix B. æ¡å¼µç¨é¢æ°ãªãã¡ã¬ã³ã¹
Cè¨èªããRubyã®æ©è½ãå©ç¨ããAPIã¯ä»¥ä¸ã®éãã§ããï¼
å
VALUE |
Rubyãªãã¸ã§ã¯ãã表ç¾ããåï¼å¿ è¦ã«å¿ãã¦ãã£ã¹ããã¦ç¨ããï¼ çµã¿è¾¼ã¿åã表ç¾ããCã®åã¯ruby.hã«è¨è¿°ãã¦ããRã§å§ã¾ãæ§é ä½ã§ããï¼VALUEåããããã«ãã£ã¹ãããããã«Rã§å§ã¾ãæ§é ä½ åãå ¨ã¦å¤§æåã«ããååã®ãã¯ããç¨æããã¦ããï¼ |
å¤æ°ã»å®æ°
Qnil |
å®æ°: nilãªãã¸ã§ã¯ã |
Qtrue |
å®æ°: trueãªãã¸ã§ã¯ã(çã®ããã©ã«ãå¤) |
Qfalse |
å®æ°: falseãªãã¸ã§ã¯ã |
Cãã¼ã¿ã®ã«ãã»ã«å
Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) |
Cã®ä»»æã®ãã¤ã³ã¿ãã«ãã»ã«åããRubyãªãã¸ã§ã¯ããè¿ãï¼ã ã®ãã¤ã³ã¿ãRubyããã¢ã¯ã»ã¹ãããªããªã£ãæï¼freeã§æå®ãã é¢æ°ãå¼ã°ããï¼ã¾ãï¼ãã®ãã¤ã³ã¿ã®æããã¼ã¿ãä»ã®Rubyãªã ã¸ã§ã¯ããæãã¦ããå ´åï¼markã«æå®ããé¢æ°ã§ãã¼ã¯ããå¿ è¦ ãããï¼ |
Data_Make_Struct(klass, type, mark, free, sval) |
typeåã®ã¡ã¢ãªãmallocãï¼å¤æ°svalã«ä»£å ¥ããå¾ï¼ãããã«ãã» ã«åãããã¼ã¿ãè¿ããã¯ãï¼ |
Data_Get_Struct(data, type, sval) |
dataããtypeåã®ãã¤ã³ã¿ãåãåºãå¤æ°svalã«ä»£å ¥ãããã¯ãï¼ |
åãã§ãã¯
RB_TYPE_P(value, type) TYPE(value) FIXNUM_P(value) NIL_P(value) RB_INTEGER_TYPE_P(value) RB_FLOAT_TYPE_P(value) void Check_Type(VALUE value, int type) SafeStringValue(value)
åå¤æ
FIX2INT(value), INT2FIX(i) FIX2LONG(value), LONG2FIX(l) NUM2INT(value), INT2NUM(i) NUM2UINT(value), UINT2NUM(ui) NUM2LONG(value), LONG2NUM(l) NUM2ULONG(value), ULONG2NUM(ul) NUM2LL(value), LL2NUM(ll) NUM2ULL(value), ULL2NUM(ull) NUM2OFFT(value), OFFT2NUM(off) NUM2SIZET(value), SIZET2NUM(size) NUM2SSIZET(value), SSIZET2NUM(ssize) rb_integer_pack(value, words, numwords, wordsize, nails, flags), rb_integer_unpack(words, numwords, wordsize, nails, flags) NUM2DBL(value) rb_float_new(f) RSTRING_LEN(str) RSTRING_PTR(str) StringValue(value) StringValuePtr(value) StringValueCStr(value) rb_str_new2(s)
ã¯ã©ã¹/ã¢ã¸ã¥ã¼ã«å®ç¾©
VALUE rb_define_class(const char *name, VALUE super) |
superã®ãµãã¯ã©ã¹ã¨ãã¦æ°ããRubyã¯ã©ã¹ãå®ç¾©ããï¼ |
VALUE rb_define_class_under(VALUE module, const char *name, VALUE super) |
superã®ãµãã¯ã©ã¹ã¨ãã¦æ°ããRubyã¯ã©ã¹ãå®ç¾©ãï¼moduleã® å®æ°ã¨ãã¦å®ç¾©ããï¼ |
VALUE rb_define_module(const char *name) |
æ°ããRubyã¢ã¸ã¥ã¼ã«ãå®ç¾©ããï¼ |
VALUE rb_define_module_under(VALUE module, const char *name) |
æ°ããRubyã¢ã¸ã¥ã¼ã«ãå®ç¾©ãï¼moduleã®å®æ°ã¨ãã¦å®ç¾©ããï¼ |
void rb_include_module(VALUE klass, VALUE module) |
ã¢ã¸ã¥ã¼ã«ãã¤ã³ã¯ã«ã¼ãããï¼classããã§ã«moduleãã¤ã³ã¯ ã«ã¼ããã¦ããæã«ã¯ä½ãããªã(å¤éã¤ã³ã¯ã«ã¼ãã®ç¦æ¢)ï¼ |
void rb_extend_object(VALUE object, VALUE module) |
ãªãã¸ã§ã¯ããã¢ã¸ã¥ã¼ã«(ã§å®ç¾©ããã¦ããã¡ã½ãã)ã§æ¡å¼µããï¼ |
大åå¤æ°å®ç¾©
void rb_define_variable(const char *name, VALUE *var) |
Rubyã¨Cã¨ã§å ±æããã°ãã¼ãã«å¤æ°ãå®ç¾©ããï¼å¤æ°åã`$‘㧠å§ã¾ããªãæã«ã¯èªåçã«è¿½å ãããï¼nameã¨ãã¦Rubyã®èå¥å ã¨ãã¦è¨±ãããªãæå(ä¾ãã°` ’)ãå«ãå ´åã«ã¯Rubyããã°ã© ã ããã¯è¦ããªããªãï¼ |
void rb_define_readonly_variable(const char *name, VALUE *var) |
Rubyã¨Cã¨ã§å ±æããread onlyã®ã°ãã¼ãã«å¤æ°ãå®ç¾©ããï¼ read onlyã§ãããã¨ä»¥å¤ã¯rb_define_variable()ã¨åãï¼ |
void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) |
é¢æ°ã«ãã£ã¦å®ç¾ãããRubyå¤æ°ãå®ç¾©ããï¼å¤æ°ãåç §ããã æã«ã¯getterãï¼å¤æ°ã«å¤ãã»ãããããæã«ã¯setterãå¼ã°ã ãï¼ |
void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) |
é¢æ°ã«ãã£ã¦hookã®ã¤ããããã°ãã¼ãã«å¤æ°ãå®ç¾©ããï¼å¤æ° ãåç §ãããæã«ã¯getterãï¼é¢æ°ã«å¤ãã»ãããããæã«ã¯ setterãå¼ã°ããï¼getterãsetterã«0ãæå®ããæã«ã¯hookã æå®ããªãã®ã¨åãäºã«ãªãï¼ |
void rb_global_variable(VALUE *var) |
GCã®ããï¼Rubyããã°ã©ã ããã¯ã¢ã¯ã»ã¹ãããªãã, Rubyãªã ã¸ã§ã¯ããå«ã大åå¤æ°ããã¼ã¯ããï¼ |
å®æ°
void rb_define_const(VALUE klass, const char *name, VALUE val) |
å®æ°ãå®ç¾©ããï¼ |
void rb_define_global_const(const char *name, VALUE val) |
大åå®æ°ãå®ç¾©ããï¼ rb_define_const(rb_cObject, name, val) ã¨åãæå³ï¼ |
ã¡ã½ããå®ç¾©
rb_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc) |
ã¡ã½ãããå®ç¾©ããï¼argcã¯selfãé¤ãå¼æ°ã®æ°ï¼argcã-1ã®æ, é¢æ°ã«ã¯å¼æ°ã®æ°(selfãå«ã¾ãªã)ã第1å¼æ°, å¼æ°ã®é åã第2 å¼æ°ã¨ããå½¢å¼ã§ä¸ãããã(第3å¼æ°ã¯self)ï¼argcã-2ã®æ, 第1å¼æ°ãself, 第2å¼æ°ãargs(argsã¯å¼æ°ãå«ãRubyã®é å)㨠ããå½¢å¼ã§ä¸ããããï¼ |
rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc) |
privateã¡ã½ãããå®ç¾©ããï¼å¼æ°ã¯rb_define_method()ã¨åãï¼ |
rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc) |
ç¹ç°ã¡ã½ãããå®ç¾©ããï¼å¼æ°ã¯rb_define_method()ã¨åãï¼ |
rb_check_arity(int argc, int min, int max) |
å¼æ°ã®æ°ã§ããargcãmin..maxã®ç¯å²ã«å ¥ã£ã¦ãããããã§ãã¯ãã¾ãï¼ ããmaxãUNLIMITED_ARGUMENTSãªãï¼ä¸éã¯ãã§ãã¯ãã¾ããï¼ ããargcãç¯å²å¤ãªãArgumentErrorãçºçãã¾ãï¼ |
rb_scan_args(int argc, VALUE *argv, const char *fmt, …) |
argc, argvå½¢å¼ã§ä¸ããããæå®ããããã©ã¼ãããã«å¾ã£ã¦å¼ æ°ãå解ãï¼ç¶ãVALUEã¸ã®åç §ã«ã»ãããã¾ãï¼ãã®ãã©ã¼ãã ãã¯ï¼ABNFã§è¨è¿°ããã¨ä»¥ä¸ã®éãã§ãï¼ scan-arg-spec := param-arg-spec [option-hash-arg-spec] [block-arg-spec] param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec / pre-opt-post-arg-spec pre-arg-spec := num-of-leading-mandatory-args [num-of-optional-args] post-arg-spec := sym-for-variable-length-args [num-of-trailing-mandatory-args] pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args num-of-trailing-mandatory-args option-hash-arg-spec := sym-for-option-hash-arg block-arg-spec := sym-for-block-arg num-of-leading-mandatory-args := DIGIT ; å é ã«ç½®ãããçç¥ä¸è½ãªå¼æ°ã®æ° num-of-optional-args := DIGIT ; ç¶ãã¦ç½®ãããçç¥å¯è½ãªå¼æ°ã®æ° sym-for-variable-length-args := "*" ; ç¶ãã¦ç½®ãããå¯å¤é·å¼æ°ã ; Rubyã®é åã§åå¾ããããã®æå® num-of-trailing-mandatory-args := DIGIT ; çµç«¯ã«ç½®ãããçç¥ä¸è½ãªå¼æ°ã®æ° sym-for-option-hash-arg := ":" ; ãªãã·ã§ã³ããã·ã¥ãåå¾ãã ; ããã®æå®; çç¥ä¸è½ãªå¼æ°ã® ; æ°ãããå¤ãã®å¼æ°ãæå®ããï¼ ; æå¾ã®å¼æ°ãããã·ã¥ï¼ã¾ã㯠; #to_hashã§å¤æå¯è½ï¼ã®å ´åã« ; åå¾ãããï¼æå¾ã®å¼æ°ãnilã® ; å ´åï¼å¯å¤é·å¼æ°æå®ããªãï¼ ; çç¥ä¸è½å¼æ°ã®æ°ãããå¤ãã® ; å¼æ°ãæå®ãããå ´åã«åå¾ããã sym-for-block-arg := "&" ; ã¤ãã¬ã¼ã¿ãããã¯ãåå¾ããããã® ; æå® ãã©ã¼ãããã“12”ã®å ´åï¼å¼æ°ã¯æä½1ã¤ã§ï¼3ã¤(1+2)ã¾ã§è¨±ã ããã¨ããæå³ã«ãªãã¾ãï¼å¾ã£ã¦ï¼ãã©ã¼ãããæååã«ç¶ã ã¦3ã¤ã®VALUEã¸ã®åç §ãç½®ãå¿ è¦ãããã¾ãï¼ãããã«ã¯åå¾ãã å¤æ°ãã»ããããã¾ãï¼å¤æ°ã¸ã®åç §ã®ä»£ããã«NULLãæå®ãã ãã¨ãã§ãï¼ãã®å ´åã¯åå¾ããå¼æ°ã®å¤ã¯æ¨ã¦ããã¾ãï¼ãªãï¼ çç¥å¯è½å¼æ°ãçç¥ãããæã®å¤æ°ã®å¤ã¯nil(Cè¨èªã®ã¬ãã«ã§ã¯ Qnil)ã«ãªãã¾ãï¼ è¿ãå¤ã¯ä¸ããããå¼æ°ã®æ°ã§ãï¼ãªãã·ã§ã³ããã·ã¥ããã³ã¤ ãã¬ã¼ã¿ãããã¯ã¯æ°ãã¾ããï¼ |
int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values) |
ãã¼ã¯ã¼ãã§æå®ãããå¤ãtableã«ãããã£ã¦åãåºãã¾ãï¼ tableã®æåã®requiredåã®IDã¯å¿ é ãã¼ã¯ã¼ãã表ãï¼ç¶ã optional (optionalãè² ã®å ´åã¯-optional-1) åã®IDã¯çç¥å¯è½ ãã¼ã¯ã¼ãã§ãï¼å¿ é ãã¼ã¯ã¼ããkeyword_hashä¸ã«ãªãå ´åï¼ “missing keyword”ArgumentErrorãçºçãã¾ãï¼çç¥å¯è½ãã¼ã¯ã¼ ãããªãå ´åã¯ï¼valuesä¸ã®å¯¾å¿ããè¦ç´ ã«ã¯Qundefãã»ãããã ã¾ãï¼keyword_hashã«ä½¿ç¨ãããªãè¦ç´ ãããå ´åã¯ï¼optionalã è² ãªãç¡è¦ããã¾ããï¼ããã§ãªããã°“unknown keyword” ArgumentErrorãçºçãã¾ãï¼ |
VALUE rb_extract_keywords(VALUE *original_hash) |
original_hashã§åç §ãããHashãªãã¸ã§ã¯ãããï¼Symbolã§ãã ãã¼ã¨ãã®å¤ãæ°ããHashã«åãåºãã¾ãï¼original_hashã®æã å ã«ã¯ï¼å ã®HashãSymbol以å¤ã®ãã¼ãå«ãã§ããå ´åã¯ãããã ã³ãã¼ãããå¥ã®æ°ããHashï¼ããã§ãªããã°0ãä¿åããã¾ãï¼ |
Rubyã¡ã½ããå¼ã³åºã
VALUE rb_funcall(VALUE recv, ID mid, int narg, …) |
ã¡ã½ããå¼ã³åºãï¼æååããmidãå¾ãããã«ã¯rb_intern()ã 使ãï¼ private/protectedãªã¡ã½ããã§ãå¼ã³åºããï¼ |
VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) |
|
VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv) |
ã¡ã½ããå¼ã³åºãï¼å¼æ°ãargc, argvå½¢å¼ã§æ¸¡ãï¼ private/protectedãªã¡ã½ããã§ãå¼ã³åºããï¼ |
VALUE rb_funcallv_public(VALUE recv, ID mid, int argc, VALUE *argv) |
ã¡ã½ããå¼ã³åºãï¼ publicãªã¡ã½ããããå¼ã¹ãªãï¼ |
VALUE rb_eval_string(const char *str) |
æååãRubyã¹ã¯ãªããã¨ãã¦ã³ã³ãã¤ã«ã»å®è¡ããï¼ |
ID rb_intern(const char *name) |
æååã«å¯¾å¿ããIDãè¿ãï¼ |
char *rb_id2name(ID id) |
IDã«å¯¾å¿ããæååãè¿ã(ãããã°ç¨)ï¼ |
char *rb_class2name(VALUE klass) |
ã¯ã©ã¹ã®ååãè¿ã(ãããã°ç¨)ï¼ã¯ã©ã¹ãååãæããªãæã« ã¯, ç¥å ãé¡ã£ã¦ååãæã¤ã¯ã©ã¹ã®ååãè¿ãï¼ |
int rb_respond_to(VALUE obj, ID id) |
objãidã§ç¤ºãããã¡ã½ãããæã¤ãã©ãããè¿ãï¼ |
ã¤ã³ã¹ã¿ã³ã¹å¤æ°
VALUE rb_iv_get(VALUE obj, const char *name) |
objã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã®å¤ãå¾ãï¼`@‘ã§å§ã¾ããªãã¤ã³ã¹ã¿ã³ ã¹å¤æ°ã¯ Rubyããã°ã©ã ããã¢ã¯ã»ã¹ã§ããªããé ãããã¤ã³ ã¹ã¿ã³ã¹å¤æ°ã«ãªãï¼å®æ°ã¯å¤§æåã®ååãæã¤ã¯ã©ã¹(ã¾ã㯠ã¢ã¸ã¥ã¼ã«)ã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ã¨ãã¦å®è£ ããã¦ããï¼ |
VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) |
objã®ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãvalã«ã»ããããï¼ |
å¶å¾¡æ§é
VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2) |
funcããããã¯ã¨ãã¦è¨å®ãï¼objãã¬ã·ã¼ãï¼argcã¨argvãå¼æ° ã¨ãã¦midã¡ã½ãããå¼ã³åºãï¼funcã¯ç¬¬ä¸å¼æ°ã«yieldãããå¤ï¼ 第äºå¼æ°ã«data2ãåãåãï¼è¤æ°ã®å¤ãyieldãããå ´å(Cã§ã¯ rb_yield_values()ã¨rb_yield_values2(), rb_yield_splat())ï¼ data2ã¯Arrayã¨ãã¦ããã¯ããã¦ããï¼ç¬¬ä¸, 第åå¼æ°ã®argc㨠argvã«ãã£ã¦yieldãããå¤ãåãåºããã¨ãã§ããï¼ |
[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) |
func2ããããã¯ã¨ãã¦è¨å®ã, func1ãã¤ãã¬ã¼ã¿ã¨ãã¦å¼ã¶ï¼ func1ã«ã¯ arg1ãå¼æ°ã¨ãã¦æ¸¡ãã, func2ã«ã¯ç¬¬1å¼æ°ã«ã¤ãã¬ã¼ ã¿ããä¸ããããå¤, 第2å¼æ°ã«arg2ã渡ãããï¼ 1.9ã§rb_iterateã使ãå ´åã¯, func1ã®ä¸ã§Rubyã¬ãã«ã®ã¡ã½ãã ãå¼ã³åºããªããã°ãªããªã. 1.9ã§obsoleteã¨ãªã£ã. 代ããã«rb_block_callãç¨æããã. |
VALUE rb_yield(VALUE val) |
valãå¤ã¨ãã¦ã¤ãã¬ã¼ã¿ãããã¯ãå¼ã³åºãï¼ |
VALUE rb_rescue(VALUE (*func1)(ANYARGS), VALUE arg1, VALUE (*func2)(ANYARGS), VALUE arg2) |
é¢æ°func1ãarg1ãå¼æ°ã«å¼ã³åºãï¼func1ã®å®è¡ä¸ã«ä¾å¤ãçºç ããæã«ã¯ func2ãarg2ã第ä¸å¼æ°, çºçããä¾å¤ãªãã¸ã§ã¯ã ã第äºå¼æ°ã¨ãã¦å¼ã¶ï¼æ»ãå¤ã¯ä¾å¤ãçºçããªãã£ãæã¯func1 ã®æ»ãå¤, ä¾å¤ãçºçããæã«ã¯func2ã®æ»ãå¤ã§ããï¼ |
VALUE rb_ensure(VALUE (*func1)(ANYARGS), VALUE arg1, VALUE (*func2)(ANYARGS), VALUE arg2) |
é¢æ°func1ãarg1ãå¼æ°ã¨ãã¦å®è¡ã, å®è¡çµäºå¾(ãã¨ãä¾å¤ã çºçãã¦ã) func2ãarg2ãå¼æ°ã¨ãã¦å®è¡ããï¼æ»ãå¤ã¯func1 ã®æ»ãå¤ã§ãã(ä¾å¤ãçºçããæã¯æ»ããªã)ï¼ |
VALUE rb_protect(VALUE (*func) (VALUE), VALUE arg, int *state) |
é¢æ°funcãargãå¼æ°ã¨ãã¦å®è¡ã, ä¾å¤ãçºçããªããã°ãã®æ» ãå¤ãè¿ãï¼ä¾å¤ãçºçããå ´åã¯, *stateã«é0ãã»ããã㦠Qnilãè¿ãï¼ rb_jump_tag()ãå¼ã°ãã«ææããä¾å¤ãç¡è¦ããå ´åã«ã¯ï¼ rb_set_errinfo(Qnil)ã§ã¨ã©ã¼æ å ±ãã¯ãªã¢ããªããã°ãªããªãï¼ |
void rb_jump_tag(int state) |
rb_protect()ãrb_eval_string_protect()ã§ææãããä¾å¤ãå éããï¼stateã¯ãããã®é¢æ°ããè¿ãããå¤ã§ãªããã°ãªããªãï¼ ãã®é¢æ°ã¯ç´æ¥ã®å¼ã³åºãå ã«æ»ããªãï¼ |
void rb_iter_break() |
ç¾å¨ã®æãå å´ã®ãããã¯ãçµäºããï¼ãã®é¢æ°ã¯ç´æ¥ã®å¼ã³åº ãå ã«æ»ããªãï¼ |
void rb_iter_break_value(VALUE value) |
ç¾å¨ã®æãå å´ã®ãããã¯ãvalueã§çµäºããï¼ãããã¯ã¯å¼æ°ã§ ä¸ããããvalueãè¿ãï¼ãã®é¢æ°ã¯ç´æ¥ã®å¼ã³åºãå ã«æ»ããªãï¼ |
ä¾å¤ã»ã¨ã©ã¼
void rb_warning(const char *fmt, …) |
rb_verboseæã«æ¨æºã¨ã©ã¼åºåã«è¦åæ å ±ã表示ããï¼å¼æ°ã¯ printf()ã¨åãï¼ |
void rb_raise(rb_eRuntimeError, const char *fmt, …) |
RuntimeErrorä¾å¤ãçºçãããï¼å¼æ°ã¯printf()ã¨åãï¼ |
void rb_raise(VALUE exception, const char *fmt, …) |
exceptionã§æå®ããä¾å¤ãçºçãããï¼fmt以ä¸ã®å¼æ°ã¯ printf()ã¨åãï¼ |
void rb_fatal(const char *fmt, …) |
è´å½çä¾å¤ãçºçãããï¼é常ã®ä¾å¤å¦çã¯è¡ãªããã, ã¤ã³ã¿ã¼ ããªã¿ãçµäºãã(ãã ãensureã§æå®ãããã³ã¼ãã¯çµäºåã« å®è¡ããã)ï¼ |
void rb_bug(const char *fmt, …) |
ã¤ã³ã¿ã¼ããªã¿ãªã©ããã°ã©ã ã®ãã°ã§ããçºçããã¯ãã®ãªã ç¶æ³ã®æå¼ã¶ï¼ã¤ã³ã¿ã¼ããªã¿ã¯ã³ã¢ãã³ããç´ã¡ã«çµäºããï¼ ä¾å¤å¦çã¯ä¸åè¡ãªãããªãï¼ |
注æ: “%”PRIsVALUEãObject#to_s(‘+’ãã©ã°ãæå®ããã¦ãã㨠ãã¯Object#inspect)ã使ã£ãVALUEã®åºåã«å©ç¨ã§ããï¼ãã㯠“%i”ã¨è¡çªããããï¼æ´æ°ã«ã¯“%d”ã使ç¨ãããã¨ï¼
Rubyã®åæåã»å®è¡
Rubyãã¢ããªã±ã¼ã·ã§ã³ã«åãè¾¼ãå ´åã«ã¯ä»¥ä¸ã®ã¤ã³ã¿ãã§ã¼ã¹ ã使ãï¼é常ã®æ¡å¼µã©ã¤ãã©ãªã«ã¯å¿ è¦ãªãï¼
void ruby_init() |
Rubyã¤ã³ã¿ããªã¿ã®åæåãè¡ãªãï¼ |
void *ruby_options(int argc, char **argv) |
Rubyã¤ã³ã¿ããªã¿ã®ã³ãã³ãã©ã¤ã³å¼æ°ã®å¦çãè¡ãªãï¼ Rubyã®ã½ã¼ã¹ã³ã¼ããã³ã³ãã¤ã«ããï¼ ã³ã³ãã¤ã«ãããã½ã¼ã¹ã¸ã®ãã¤ã³ã¿ï¼ãããã¯ç¹æ®å¤ãè¿ã. |
int ruby_run_node(void *n) |
ã³ã³ãã¤ã«ãããã³ã¼ããå®è¡ããï¼ å®è¡ã«æåããå ´åã¯EXIT_SUCCESSãï¼ã¨ã©ã¼ãèµ·ãã£ãã¨ãã¯ãã以å¤ãè¿ãï¼ |
void ruby_script(char *name) |
Rubyã®ã¹ã¯ãªããå($0)ãè¨å®ããï¼ |
ã¤ã³ã¿ããªã¿ã®ã¤ãã³ãã®ããã¯
void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data) |
æå®ãããã¤ã³ã¿ããªã¿ã®ã¤ãã³ãã«å¯¾ããããã¯é¢æ°ã追å ãã¾ãï¼ eventsã¯ä»¥ä¸ã®å¤ã®orã§ãªããã°ãªãã¾ãã: RUBY_EVENT_LINE RUBY_EVENT_CLASS RUBY_EVENT_END RUBY_EVENT_CALL RUBY_EVENT_RETURN RUBY_EVENT_C_CALL RUBY_EVENT_C_RETURN RUBY_EVENT_RAISE RUBY_EVENT_ALL rb_event_hook_func_tã®å®ç¾©ã¯ä»¥ä¸ã®éãã§ã: typedef void (*rb_event_hook_func_t)(rb_event_t event, VALUE data, VALUE self, ID id, VALUE klass) rb_add_event_hook() ã®ç¬¬3å¼æ° data ã¯ï¼ããã¯é¢æ°ã®ç¬¬2å¼æ°ã¨ ãã¦æ¸¡ããã¾ãï¼ããã¯1.8ã§ã¯ç¾å¨ã®NODEã¸ã®ãã¤ã³ã¿ã§ããï¼ä»¥ ä¸ã® RB_EVENT_HOOKS_HAVE_CALLBACK_DATA ãåç §ãã¦ãã ããï¼ |
int rb_remove_event_hook(rb_event_hook_func_t func) |
æå®ãããããã¯é¢æ°ãåé¤ãã¾ãï¼ |
ã¡ã¢ãªä½¿ç¨é
void rb_gc_adjust_memory_usage(ssize_t diff) |
ç»é²ãããå¤é¨ã®ã¡ã¢ãªä½¿ç¨éã調æ´ãã¾ãï¼ãã®é¢æ°ã§å¤é¨ã®ã©ã¤ãã©ãªã ã©ã®ãããã¡ã¢ãªã使ã£ã¦ããã®ããGCã«ä¼ãããã¨ãã§ãã¾ãï¼æ£ã®diff㧠ãã®é¢æ°ãå¼ã³åºãã¨ã¡ã¢ãªä½¿ç¨éã®å¢å ãæå³ãã¾ãï¼æ°ããã¡ã¢ãªããã ã¯ã確ä¿ããããï¼ãããã¯ããã大ããªãµã¤ãºã§åå²ãå½ã¦ããããããå ´ åãªã©ã§ãï¼è² ã®diffã§ãã®é¢æ°ãå¼ã³åºãã¨ã¡ã¢ãªä½¿ç¨éã®æ¸å°ãæå³ãã¾ ãï¼ã¡ã¢ãªãããã¯ã解æ¾ããããï¼ã¡ã¢ãªãããã¯ãããå°ãããµã¤ãºã§å 確ä¿ããããããå ´åãªã©ã§ãï¼ãã®é¢æ°ã¯GCãå¼ãèµ·ããããããã¾ããï¼ |
äºææ§ã®ããã®ãã¯ã
APIã®äºææ§ããã§ãã¯ããããã«ä»¥ä¸ã®ãã¯ããããã©ã«ãã§å®ç¾©ããã¦ãã¾ãï¼
NORETURN_STYLE_NEW |
NORETURN ãã¯ããé¢æ°åãã¯ãã¨ãã¦å®ç¾©ããã¦ãããã¨ãæå³ããï¼ |
HAVE_RB_DEFINE_ALLOC_FUNC |
rb_define_alloc_func() é¢æ°ãæä¾ããã¦ãããã¨ï¼ã¤ã¾ã allocation framework ã使ããããã¨ãæå³ããï¼ have_func(“rb_define_alloc_func”, “ruby.h”) ã®çµæã¨åãï¼ |
HAVE_RB_REG_NEW_STR |
Stringãªãã¸ã§ã¯ãããRegexpãªãã¸ã§ã¯ããä½ã rb_reg_new_str() é¢æ°ãæä¾ããã¦ãããã¨ãæå³ããï¼ have_func(“rb_reg_new_str”, “ruby.h”). ã®çµæã¨åãï¼ |
HAVE_RB_IO_T |
rb_io_t åãæä¾ããã¦ãããã¨ãæå³ããï¼ |
USE_SYMBOL_AS_METHOD_NAME |
ã¡ã½ããåãè¿ãã¡ã½ããï¼Module#methods, #singleton_methods ãªã©ãSymbolãè¿ããã¨ãæå³ããï¼ |
HAVE_RUBY_*_H |
ruby.h ã§å®ç¾©ããã¦ããï¼å¯¾å¿ããããããæä¾ããã¦ããã㨠ãæå³ããï¼ãã¨ãã°ï¼HAVE_RUBY_ST_H ãå®ç¾©ããã¦ããå ´å㯠åãªã st.h ã§ã¯ãªã ruby/st.h ã使ç¨ããï¼ |
RB_EVENT_HOOKS_HAVE_CALLBACK_DATA |
rb_add_event_hook() ãããã¯é¢æ°ã«æ¸¡ã data ã第3å¼æ°ã¨ã㦠åãåããã¨ãæå³ããï¼ |
Appendix C. extconf.rbã§ä½¿ããé¢æ°ãã¡
extconf.rbã®ä¸ã§ã¯å©ç¨å¯è½ãªã³ã³ãã¤ã«æ¡ä»¶ãã§ãã¯ã®é¢æ°ã¯ä»¥ ä¸ã®éãã§ããï¼
have_macro(macro, headers) |
ããããã¡ã¤ã«headerãã¤ã³ã¯ã«ã¼ããã¦ãã¯ãmacroãå®ç¾©ã ãã¦ãããã©ãããã§ãã¯ããï¼ãã¯ããå®ç¾©ããã¦ããætrue ãè¿ãï¼ |
have_library(lib, func) |
é¢æ°funcãå®ç¾©ãã¦ããã©ã¤ãã©ãªlibã®åå¨ããã§ãã¯ããï¼ ãã§ãã¯ã«æåããã¨ï¼-llibã$libsã«è¿½å ãï¼trueãè¿ãï¼ |
find_library(lib, func, path…) |
é¢æ°funcãå®ç¾©ãã¦ããã©ã¤ãã©ãªlibã®åå¨ã -Lpath ã追å ããªãããã§ãã¯ããï¼ãã§ãã¯ã«æåããã¨ï¼-llibã$libs㫠追å ãï¼trueãè¿ãï¼ |
have_func(func, header) |
ããããã¡ã¤ã«headerãã¤ã³ã¯ã«ã¼ããã¦é¢æ°funcã®åå¨ãã㧠ãã¯ããï¼funcãæ¨æºã§ã¯ãªã³ã¯ãããªãã©ã¤ãã©ãªå ã®ãã®ã§ ããæã«ã¯å ã«have_libraryã§ãã®ã©ã¤ãã©ãªããã§ãã¯ãã¦ã ãäºï¼ãã§ãã¯ã«æåããã¨ï¼ããªããã»ããµãã¯ã `HAVE_{FUNC}` ãå®ç¾©ãï¼trueãè¿ãï¼ |
have_var(var, header) |
ããããã¡ã¤ã«headerãã¤ã³ã¯ã«ã¼ããã¦å¤æ°varã®åå¨ããã§ã ã¯ããï¼varãæ¨æºã§ã¯ãªã³ã¯ãããªãã©ã¤ãã©ãªå ã®ãã®ã§ã ãæã«ã¯å ã«have_libraryã§ãã®ã©ã¤ãã©ãªããã§ãã¯ãã¦ãã äºï¼ãã§ãã¯ã«æåããã¨ï¼ããªããã»ããµãã¯ã `HAVE_{VAR}` ãå®ç¾©ãï¼trueãè¿ãï¼ |
have_header(header) |
ããããã¡ã¤ã«ã®åå¨ããã§ãã¯ããï¼ãã§ãã¯ã«æåããã¨ï¼ ããªããã»ããµãã¯ã `HAVE_{HEADER_H}` ãå®ç¾©ãï¼trueãè¿ãï¼ (ã¹ã©ãã·ã¥ããããã¯ã¢ã³ãã¼ã¹ã³ã¢ã«ç½®æããã) |
find_header(header, path…) |
ããããã¡ã¤ã«headerã®åå¨ã -Ipath ã追å ããªãããã§ã㯠ããï¼ãã§ãã¯ã«æåããã¨ï¼ããªããã»ããµãã¯ã `HAVE_{HEADER_H}` ãå®ç¾©ãï¼trueãè¿ãï¼ (ã¹ã©ãã·ã¥ããããã¯ã¢ã³ãã¼ã¹ã³ã¢ã«ç½®æããã) |
have_struct_member(type, member[, header[, opt]]) |
ããããã¡ã¤ã«headerãã¤ã³ã¯ã«ã¼ããã¦åtypeãå®ç¾©ããï¼ ãªããã¤ã¡ã³ãmemberãåå¨ãããããã§ãã¯ããï¼ãã§ãã¯ã« æåããã¨ï¼ããªããã»ããµãã¯ã `HAVE_{TYPE}_{MEMBER}` ã å®ç¾©ãï¼trueãè¿ãï¼ |
have_type(type, header, opt) |
ããããã¡ã¤ã«headerãã¤ã³ã¯ã«ã¼ããã¦åtypeãåå¨ãããã ãã§ãã¯ããï¼ãã§ãã¯ã«æåããã¨ï¼ããªããã»ããµãã¯ã `HAVE_TYPE_{TYPE}` ãå®ç¾©ãï¼trueãè¿ãï¼ |
check_sizeof(type, header) |
ããããã¡ã¤ã«headerãã¤ã³ã¯ã«ã¼ããã¦åtypeã®charåä½ãµã¤ ãºã調ã¹ãï¼ãã§ãã¯ã«æåããã¨ï¼ããªããã»ããµãã¯ã `SIZEOF_{TYPE}` ãå®ç¾©ãï¼ãã®ãµã¤ãºãè¿ãï¼å®ç¾©ããã¦ã㪠ãã¨ãã¯nilãè¿ãï¼ |
create_makefile(target[, target_prefix]) |
æ¡å¼µã©ã¤ãã©ãªç¨ã®Makefileãçæããï¼ãã®é¢æ°ãå¼ã°ãªãã ã°ãã®ã©ã¤ãã©ãªã¯ã³ã³ãã¤ã«ãããªãï¼targetã¯ã¢ã¸ã¥ã¼ã«å ã表ãï¼ |
find_executable(command, path) |
ã³ãã³ãcommandãFile::PATH_SEPARATORã§åºåããããã¹åã® ãªã¹ãpathããæ¢ãï¼pathãnilã¾ãã¯çç¥ãããå ´åã¯ï¼ç°å¢ å¤æ°PATHã®å¤ã使ç¨ããï¼å®è¡å¯è½ãªã³ãã³ããè¦ã¤ãã£ãå ´å ã¯ãã¹ãå«ããã¡ã¤ã«åï¼è¦ã¤ãããªãã£ãå ´åã¯nilãè¿ãï¼ |
with_config(withval[, default=nil]) |
ã³ãã³ãã©ã¤ã³ä¸ã®–with-<withval>ã§æå®ããããªãã·ã§ã³å¤ ãå¾ãï¼ |
enable_config(config, *defaults) |
|
disable_config(config, *defaults) |
ã³ãã³ãã©ã¤ã³ä¸ã®–enable-<config>ã¾ã㯠–disable-<config>ã§æå®ãããçå½å¤ãå¾ãï¼ –enable-<config>ãæå®ããã¦ããå ´åã¯trueï¼ –disable-<config>ãæå®ããã¦ããå ´åã¯falseãè¿ãï¼ ã©ã¡ããæå®ããã¦ããªãå ´åã¯ï¼ãããã¯ã¤ãã§å¼ã³åºãã㦠ããå ´åã¯*defaultsãyieldããçµæï¼ãããã¯ãªããªã *defaultsãè¿ãï¼ |
dir_config(target[, default_dir]) |
|
dir_config(target[, default_include, default_lib]) |
ã³ãã³ãã©ã¤ã³ä¸ã®–with-<target>-dir, –with-<target>-include, –with-<target>-libã®ããããã§æå®ããããã£ã¬ã¯ããªã $CFLAGS ã $LDFLAGS ã«è¿½å ããï¼–with-<target>-dir=/path㯠–with-<target>-include=/path/include –with-<target>-lib=/path/lib ã¨ç価ã§ããï¼è¿½å ããã include ãã£ã¬ã¯ããªã¨ lib ãã£ã¬ ã¯ããªã®é åãè¿ãï¼ ([include_dir, lib_dir]) |
pkg_config(pkg, option=nil) |
pkg-configã³ãã³ãããããã±ã¼ã¸pkgã®æ å ±ã [cflags, ldflags, libs] ã®é åã¨ãã¦å¾ãï¼$CFLAGS, $LDFLAGS, $libs ã«ã¯ããããã®å¤ã 追å ãããï¼ pkg-configã®å®éã®ã³ãã³ãã¯ï¼ä»¥ä¸ã®é ã§è©¦ãããï¼
optionãæå®ãããå ´åã¯ï¼ä¸è¨ã®é åã®ä»£ããã«ãã®ãªãã·ã§ã³ã æå®ãã¦å¾ãããåºåãstripãããã®ãè¿ãï¼ |
Appendix D. ä¸ä»£å¥GC
Ruby 2.1ããä¸ä»£å¥GCã«å¯¾å¿ãã¾ããï¼æã ã¯ãããRGenGCã¨å¼ãã§ãã¾ãï¼ RGenGCã¯ï¼éå»ã®æ¡å¼µã©ã¤ãã©ãªã«ï¼ã»ã¼ï¼äºææ§ãä¿ã¤ããã«éçºããã¦ãã ããï¼æ¡å¼µã©ã¤ãã©ãªå´ã®å¯¾å¿ã¯ã»ã¼ä¸è¦ã§ãï¼
ãã ãï¼å¯¾å¿ããããã¨ã§æ§è½ãåä¸ãããã¨ãã§ããå¯è½æ§ãããã¾ãï¼ãã æ¡å¼µã©ã¤ãã©ãªã«é«ãæ§è½ãå¿ è¦ã§ããå ´åã¯å¯¾å¿ãæ¤è¨ãã¦ä¸ããï¼
ã¨ãã«RARRAY_PTR()/RHASH_TBL()ã®ãããªãã¯ããç¨ãã¦ãã¤ã³ã¿ã«ç´æ¥ã¢ã¯ã» ã¹ãããããªã³ã¼ãã¯æ¸ããªãããã«ãã¦ä¸ããï¼ä»£ããã«ï¼rb_ary_aref(), rb_ary_store() ãªã©ã®ï¼é©å㪠API é¢æ°ãå©ç¨ããããã«ãã¦ä¸ããï¼
ãã®ã»ãï¼å¯¾å¿ã«ã¤ãã¦ã®è©³ç´°ã¯ extension.rdoc ã®ãAppendix D. Generational GCããåç §ãã¦ä¸ããï¼
:enddoc: Local variables: :enddoc: fill-column: 60 :enddoc: end: