English
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-
includeãããã¢ãžã¥ãŒã«
T_MATCH-
MatchDataãªããžã§ã¯ã
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, rb_len_t 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_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, rb_len_t 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, rb_len_t 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, rb_len_t 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, rb_len_t 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, rb_len_t len)-
Rubyã®æååã®ãµã€ãºã len ãã€ãã«å€æŽããïŒstr ã®é·ãã¯å以ãŠã»ãããããŠããªããã°ãªããªãïŒlen ãå ã®é·ããããçãæã¯ïŒlen ãã€ããè¶ããéšåã®å å®¹ã¯æšãŠãããïŒlen ãå ã®é·ããããé·ãæã¯ïŒå ã®é·ããè¶ããéšåã®å 容ã¯ä¿åãããªãã§ãŽãã«ãªãã ããïŒãã®é¢æ°ã®åŒã³åºãã«ãã£ãŠ
RSTRING_PTR(str)ã倿Žããããããããªãããšã«æ³šæïŒ rb_str_set_len(VALUE str, rb_len_t len)-
Rubyã®æååã®ãµã€ãºã len ãã€ãã«ã»ããããïŒstr ã倿Žå¯èœã§ãªããã°äŸå€ãçºçããïŒ
RSTRING_LEN(str)ãšã¯ç¡é¢ä¿ã«ïŒlen_ ãã€ããŸã§ã®å 容ã¯ä¿åãããïŒlen 㯠str ã®å®¹éãè¶ããŠããŠã¯ãªããªãïŒ rb_str_modify(VALUE str)-
Rubyã®æååã®å€æŽããæºåãããïŒstr ã倿Žå¯èœã§ãªããã°äŸå€ãçºçããïŒstr ã®ãããã¡ãå ±æãããŠããå Žåã¯ïŒæ°ãããããã¡ãå²ãåœãŠãŠå ±æãããŠããªãç¶æ ã«ããïŒ
RSTRING_PTRã䜿ã£ãŠäžèº«ã倿ŽãããïŒrb_str_set_lenãåŒãã ãããåã«ã¯ïŒå¿ ããã®é¢æ°ãåŒã°ãªãããªããªãïŒ
é åã«å¯Ÿãã颿°¶ ↑
rb_ary_new()-
èŠçŽ ã0ã®é åãçæããïŒ
rb_ary_new2(rb_len_t len)rb_ary_new_capa(rb_len_t len)-
èŠçŽ ã0ã®é åãçæããïŒlen èŠçŽ åã®é åããããããå²ãåœãŠãŠããïŒ
rb_ary_new3(rb_len_t n, ...)rb_ary_new_from_args(rb_len_t n, ...)-
åŒæ°ã§æå®ãã n èŠçŽ ãå«ãé åãçæããïŒ
rb_ary_new4(rb_len_t n, VALUE *elts)rb_ary_new_from_values(rb_len_t 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, rb_len_t offset)-
ary[offset] rb_ary_store(VALUE ary, rb_len_t offset, VALUE obj)-
ary[offset] = obj rb_ary_subseq(VALUE ary, rb_len_t beg, rb_len_t 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(val),ary.pop,ary.shift,ary.unshift(val) rb_ary_cat(VALUE ary, const VALUE *ptr, rb_len_t 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, rb_len_t 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, rb_len_t 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ã®ã¬ãã«ããåç §ã§ããŸãïŒ
QtrueQfalse-
çåœå€ïŒCèšèªããèŠãã
trueããšãfalseãïŒ Qnil-
CèšèªããèŠãã
nilãïŒ
RTEST(obj)ãšãããã¯ã㯠obj ã Qfalse ã Qnil ã®ãšã0ãè¿ããŸãïŒ
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å€ã§ãïŒ
ãã®ãã¯ã㯠RUBY_TYPED_EMBEDDABLE ãã©ã°ãæã€ data_type ã«å¯ŸããŠã¯äœ¿ããŸããïŒãã®ãããªåã«ã¯ TypedData_Make_Struct ãrb_data_typed_object_zalloc ã䜿ã£ãŠãã ããïŒ
klass ã¯ãã®ãªããžã§ã¯ãã®ã¯ã©ã¹ã§ãïŒklass ã¯, Object ã¯ã©ã¹ããæŽŸçã, å¿
ã rb_define_alloc_func ã rb_undef_alloc_func ãåŒã³åºããŠallocatorãèšå®ããŠãã ããïŒ
data_type ã¯ãã®æ§é äœãRubyã管çããããã®æ
å ±ãèšè¿°ããconst rb_data_type_tåãžã®ãã€ã³ã¿ã§ãïŒ
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 *);
/* reserved fields */
} 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 ã¯ãã®æ§é äœãããäžèŠã«ãªã£ãæã«åŒã°ãã颿°ã§ãïŒãã®é¢æ°ãã¬ãŒããŒãžã³ã¬ã¯ã¿ããåŒã°ããŸãïŒãããRUBY_DEFAULT_FREE ã®å Žåã¯ïŒåçŽã«æ§é äœãè§£æŸãããŸãïŒ
dsize ã¯æ§é äœãæ¶è²»ããŠããã¡ã¢ãªã®ãã€ãæ°ãè¿ã颿°ã§ãïŒåŒæ°ãšããŠæ§é äœãžã®ãã€ã³ã¿ãæž¡ãããŸãïŒå®è£
å°é£ã§ããã°0 ãæž¡ããŠãå·®ãæ¯ããããŸããã, ã§ããã ãæå®ããããã«ããŠãã ããïŒ
dcompact ã¯ã¡ã¢ãªã³ã³ãã¯ã·ã§ã³ãè¡ããããšãã«åŒã³åºãããŸãïŒrb_gc_mark_movable()ã«ãã£ãŠããŒã¯ãããåç
§å¯Ÿè±¡ã® Ruby ãªããžã§ã¯ãã¯ïŒããã§rb_gc_location()ã«åºã¥ããŠæŽæ°ããããšãã§ããŸãïŒ
parent ã¯ãã®æ§é äœãç¶æ¿ããå¥ã®æ§é äœã«å¯Ÿå¿ãã rb_data_type_t ãæå®ããŸãïŒãã®å ŽåTypedData_Get_Struct()ãæŽŸçãªããžã§ã¯ããåãä»ããããã«ãªããŸãïŒ
data ã«ã¯ãŠãŒã¶ãŒå®çŸ©ã®ä»»æã®å€ãæå®ã§ããŸãïŒRubyã¯ãã®å€ã«ã¯é¢ç¥ããªãã®ã§ïŒå¥œãã«äœ¿ã£ãŠãã ããïŒ
flags ã«ã¯æ¬¡ã®ãã©ã°ã®ãã¡åœãŠã¯ãŸããã®ã®ãããåãæå®ããŸãïŒããããRubyã®ã¬ãŒããŒãžã³ã¬ã¯ã¿ã«ã€ããŠã®æ·±ãçè§£ãå¿
èŠãšããŸãã®ã§ïŒè¯ãããããªãå Žåã«ã¯0ãæå®ãããšè¯ãã§ãããïŒ
RUBY_TYPED_FREE_IMMEDIATELY-
ãã®ãã©ã°ãæå®ãããšïŒã¬ãŒããŒãžã³ã¬ã¯ã¿ã¯ãã®æ§é äœãäžèŠã«ãªã£ãå Žåã«ã¯GCäžã«çŽã¡ã«
dfreeãåŒã³åºããŸãïŒdfreeãRubyå éšã®ããã¯(GVL)ãè§£æŸããå¯èœæ§ããªãå Žåã¯ãã®ãã©ã°ãæå®ã§ããŸãïŒæå®ããªãå Žåã¯
dfreeåŒã³åºãã¯é å»¶ãã, ãã¡ã€ãã©ã€ã¶ãšåãã¿ã€ãã³ã°ã§å®è¡ãããŸãïŒ RUBY_TYPED_WB_PROTECTED-
ãªããžã§ã¯ãã®å®è£ ãã©ã€ãããªã¢ããµããŒãããŠããããšã瀺ããŸãïŒãã®ãã©ã°ãæå®ãããšRubyã¯ãã®ãªããžã§ã¯ãã«å¯ŸããŠGCãããå¹ççã«å®è¡ã§ããŸãïŒãã ãïŒæå®ããå Žåã¯ãŠãŒã¶ãŒã¯ãã®ãªããžã§ã¯ãã®ãã¹ãŠã®ã¡ãœããã®å®è£ ã«é©åã«ã©ã€ãããªã¢ãæ¿å ¥ãã責任ããããŸãïŒãããªãã°Rubyã¯å®è¡æã«ã¯ã©ãã·ã¥ããå¯èœæ§ããããŸãïŒ
ã©ã€ãããªã¢ã«ã€ããŠã¯äžä»£å¥GC ãåç §ããŠãã ããïŒ
RUBY_TYPED_FROZEN_SHAREABLE-
ãªããžã§ã¯ããfreezeãããŠããã°Ractoréã§å ±æã§ããããšã瀺ããŸãïŒEnglishãåç §ããŠãã ããïŒ
ãã®ãã©ã°ãã»ãããããŠããªããã°ïŒ
Ractor.make_shareable()ã§å ±æå¯èœã«ã¯ã§ããŸããïŒ RUBY_TYPED_EMBEDDABLE-
ãã®ãã©ã°ã¯ïŒRubyãCæ§é äœã
mallocã§å¥ã«å²ãåœãŠãã®ã§ã¯ãªãïŒãªããžã§ã¯ãã®ã¹ãããå ã«æ ŒçŽããŠãããããšã瀺ããŸãïŒãã ãïŒããã¯ä¿èšŒããããã®ã§ã¯ãããŸããïŒRubyã¯ãªããžã§ã¯ããåã蟌ãŸãªãããšãéžæããå ŽåããããŸãïŒäŸãã°ïŒãã®ãªããžã§ã¯ãã倧ããããŠïŒå©çšå¯èœãªã¹ããããµã€ãºã®ãããã«ãåãŸããªãå Žåãªã©ã§ãïŒCæ§é äœããªããžã§ã¯ãã¹ãããå ã«åã蟌ãããšã§ïŒãã€ã³ã¿ã®è¿œè·¡ã
mallocã«ãããªãŒããŒããããåæžããïŒã¹ã€ãŒãã®ããã©ãŒãã³ã¹ãåäžããŸãïŒå Žåã«ãã£ãŠã¯ïŒãªããžã§ã¯ãã®ã¡ã¢ãªäœ¿çšéãåæžã§ããããšããããŸãïŒåã蟌ã¿å¯èœãšãªãããã«ã¯ïŒåã¯ããã€ãã®å¶éã«åŸãå¿ èŠããããŸãïŒ
-
Cæ§é äœãžã®ãã€ã³ã¿ïŒãŸãã¯Cæ§é äœå éšãžã®ãã€ã³ã¿ã¯ïŒGCã®ã³ã³ãã¯ã·ã§ã³ãçºçãããšç¡å¹ã«ãªãããïŒä¿åããŠã¯ãªããŸããïŒãã ãïŒRuby ãªããžã§ã¯ããã¹ã¿ãã¯äžã«æ®ã£ãŠããéãïŒãã®ãããªãã€ã³ã¿ãæž¡ããã䜿çšãããããããšã¯æå¹ã§ãïŒ
ããæå³ïŒããã¯ã¹ã¿ãã¯äžã«å²ãåœãŠãããæ§é äœã«å¯Ÿããå¶éãšäŒŒãŠããŸãïŒ
ãªããžã§ã¯ããã³ã³ãã¯ã·ã§ã³ã«ãã£ãŠç§»åããããè§£æŸããããããªãããšãä¿èšŒããã«ã¯ïŒ
RB_GC_GUARDãã¯ãã䜿çšããå¿ èŠããããŸãïŒãã ãïŒãªããžã§ã¯ããRuby ãã C ãžçŽæ¥åŒæ°ãšããŠæž¡ãããå ŽåïŒããªãã¡rb_define_methodãªã©ã§äœ¿çšããã颿°ã®ãã©ã¡ãŒã¿ãšããŠæž¡ãããå Žåã¯é€ããŸãïŒ -
DATA_PTRãRTYPEDDATA_DATAïŒTypedData_Wrap_Structãã¯ãã¯äœ¿çšã§ããŸããïŒåã蟌ã¿å¯èœãªãªããžã§ã¯ãã«å¯ŸããŠã¯ïŒRTYPEDDATA_GET_DATAãŸãã¯TypedData_Get_Structãã¯ãã®ã¿äœ¿çšå¯èœã§ãïŒãŸãïŒâRTYPEDDATA(obj)->data` ãžã®ã¢ã¯ã»ã¹ãç¡å¹ã§ãïŒ -
dfree颿°ã¯ïŒCæ§é äœèªäœãè§£æŸããŠã¯ãªããŸããïŒdfreeãRUBY_DEFAULT_FREEã«èšå®ããŠãåé¡ãããŸããïŒãã®æ©èœãæããªãå€ãããŒãžã§ã³ã®RubyããµããŒãããããã«ïŒRUBY_TYPED_EMBEDDABLEãå®çŸ©ãããŠããªãå Žåã«éãïŒCæ§é äœãæ¡ä»¶ä»ãã§è§£æŸããããšãã§ããŸãïŒ -
åã«ã¯
RUBY_TYPED_FREE_IMMEDIATELYãã©ã°ãèšå®ãããŠããå¿ èŠããããŸãïŒ
åã蟌ã¿Cæ§é äœã®ãµã€ãºãå¯å€ã§ããå ŽåïŒ
TypedData_Make_Structã®ä»£ããã«rb_data_typed_object_zallocã䜿çšã§ããŸãïŒRUBY_TYPED_EMBEDDABLEã®äœ¿ç𿹿³ã«é¢ããæ³šéä»ãã®äŸã«ã€ããŠã¯ïŒEmbedded TypedData ãåç §ããŠãã ããïŒ -
äžèšä»¥å€ã®ãã£ãŒã«ãã¯å°æ¥ã®äœ¿çšã®ããã«äºçŽãããŠãããéåžžã¯åæååã¯çç¥ãããŸããããçšãªã±ãŒã¹ã§ããïŒåçã« ârb_data_type_t` èªäœã確ä¿ããå Žåã¯ïŒ0ã¯ãªã¢ããŠãã ããïŒ
ãã®ãã¯ãã¯äŸå€ãçºçãããå¯èœæ§ãããããšã«æ³šæããŠãã ããïŒ ã©ããããã sval ãïŒè§£æŸããå¿
èŠããããªãœãŒã¹ (å²ãåœãŠãããã¡ã¢ãªïŒå€éšã©ã€ãã©ãªããã®ãã³ãã«ãªã©) ãä¿æããŠããå Žåã¯ïŒrb_protect ã䜿çšããå¿
èŠããããŸãïŒãããã¯ïŒãŸãããŒã¿ãã€ã³ã¿ã NULL ã«èšå®ããŠãªããžã§ã¯ããäœæãïŒãã®åŸãªãœãŒã¹ãå²ãåœãŠãŠãã®ãªããžã§ã¯ãã«æ ŒçŽããŸãïŒ
Cã®æ§é äœã®å²åœãšå¯Ÿå¿ãããªããžã§ã¯ãã®çæãåæã«è¡ããã¯ããšããŠä»¥äžã®ãã®ãæäŸãããŠããŸãïŒ
TypedData_Make_Struct(klass, type, data_type, sval)
ãã®ãã¯ãã®æ»ãå€ã¯çæããããªããžã§ã¯ãã®VALUEå€ã§ãïŒãã®ãã¯ãã¯ä»¥äžã®åŒã®ããã«åããŸã:
(sval = ZALLOC(type), TypedData_Wrap_Struct(klass, data_type, sval))
ãã ãïŒåã«ã¡ã¢ãªãå²ãåœãŠãã ããªãïŒäžèšã®ã³ãŒãã®ãããªãå²ãåœãŠåŸã«ã©ãããããæ¹æ³ã§ã¯ãªãïŒãã®ãã¯ãã䜿çšãã¹ãã§ãïŒãªããªãïŒãã©ãããã®éã« NoMemoryError ãçºçããå¯èœæ§ãããïŒãã®å Žå㯠sval ãã¡ã¢ãªãªãŒã¯ãšãªãããã§ãïŒ
klass, data_type 㯠Data_Wrap_Struct ãšåãåããããŸãïŒtype ã¯å²ãåœãŠãCæ§é äœã®åã§ãïŒå²ãåœãŠãããæ§é äœã¯å€æ° sval ã«ä»£å
¥ãããŸãïŒãã®å€æ°ã®å㯠type* ã§ããå¿
èŠããããŸãïŒ
åçŽãªã¡ã¢ãªå²ãåœãŠä»¥å€ã®å Žåãåæ§ã§ã:
obj = TypedData_Wrap_Struct(klass, data_type, NULL); sval = allocate_some_resource(); if (success(sval)) RTYPEDDATA_DATA(obj) = sval;
sval ããã€ã³ã¿åã§ãªãå Žåã¯ïŒvoid*ã«ãã£ã¹ãããå¿
èŠããããããããŸããïŒ
宣èšçããŒã¯/ã³ã³ãã¯ãæ§é äœåç §¶ ↑
æ§é äœã®åç §ããŠããRubyãªããžã§ã¯ããïŒæ¡ä»¶ä»ãããžãã¯ãè€éãªããŒã¿æ§é ã§ã©ãããããŠããªãïŒåçŽãªåç §ã ãã®å Žåã¯ïŒVALUEãžã®åç §ã®ãªãã»ãã(edge)ã«ãã£ãŠããŒã¯ä»ããšåç §æŽæ°ã宣èšããããšãã§ããŸãïŒ
ããã«ããïŒdmark ã dcompact ã³ãŒã«ããã¯é¢æ°ãå®çŸ©ããã«æžã¿ãŸãïŒ
åç
§ãé
眮ãããŠããæ§é äœå
ã®ãªãã»ãããžã®VALUEãã€ã³ã¿ã®éçãªã¹ããå®çŸ©ãïŒãã®åç
§ãªã¹ããæãããã« data ã¡ã³ããŒãèšå®ããŸãïŒ åç
§ãªã¹ã㯠RUBY_END_REFS ã§çµããå¿
èŠããããŸãïŒ
以äžã®ãã¯ãã䜿çšã§ããŸã:
RUBY_TYPED_DECL_MARKING-
ruby_data_type_tãedgeã䜿çšããŠããããšã瀺ããã©ã° RUBY_REFERENCES(ref_list_name)-
ref_list_name ãåç §ãªã¹ããšããŠå®çŸ©ãã
RUBY_REF_END-
åç §ãªã¹ãã®çµç«¯
RUBY_REF_EDGE(struct, member)-
struct ãã member ãedgeãšããŠå®£èšããïŒ
RUBY_REFERENCESã®ãããã¯ã®äžã§äœ¿çšããïŒ RUBY_REFS_LIST_PTR-
åç §ãªã¹ãã
dmarkãšããŠäœ¿çšã§ããããã«å€æãã
以äžã¯ dir.c ã§å®çŸ©ãããŠãã Dir ã®äŸã§ãïŒ
// ã©ãããããæ§é äœïŒ3ã€ã®ã¡ã³ãã®å
ïŒ2çªç®ãä»ã®rubyãªããžã§ã¯ããžã®åç
§
struct dir_data {
DIR *dir;
const VALUE path;
rb_encoding *enc;
}
// `path` ãšã³ããªãæã€åç
§ãªã¹ã `dir_refs` ãå®çŸ©
// RUBY_REF_ENDã§çµäºããŠããªããã°ãªããªã
RUBY_REFERENCES(dir_refs) = {
RUBY_REF_EDGE(dir_data, path),
RUBY_REF_END
};
// RUBY_TYPED_DECL_MARKINGãã»ããããŠå®çŸ©ãããåç
§ãªã¹ãã"dmark"ã«äœ¿çšããŠããã®ã§ïŒ
// ããŒã¯çšã³ãŒã«ããã¯é¢æ°ã¯äžèŠ
static const rb_data_type_t dir_data_type = {
"dir",
{RUBY_REFS_LIST_PTR(dir_refs), dir_free, dir_memsize,},
0, NULL, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_DECL_MARKING
};
ãã®ããã«ïŒåçŽãªåç §ã宣èšçã«å®£èšããããšã§ïŒGCãããŒã¯ãç§»åïŒã³ã³ãã¯ã·ã§ã³äžã®åç §ã®èªåæŽæ°ãªã©ãã§ããããã«ãªããŸãïŒ
ãªããžã§ã¯ãããæ§é äœãž¶ ↑
TypedData_Wrap_Struct ã TypedData_Make_Struct ã§çæãããªããžã§ã¯ãããæ§é äœãžã®ãã€ã³ã¿ã埩å
ããã«ã¯ä»¥äžã®ãã¯ããçšããŸãïŒ
TypedData_Get_Struct(obj, type, &data_type, sval)
Cã®æ§é äœãžã®ãã€ã³ã¿ã¯å€æ° sval ã«ä»£å ¥ãããŸãïŒ
ãããã®ãã¯ãã®äœ¿ãæ¹ã¯ã¡ãã£ãšåããã«ããã®ã§ïŒåŸã§èª¬æããäŸé¡ãåç §ããŠãã ããïŒ
äŸ: dbmã®æ¡åŒµã©ã€ãã©ãªã®äœæ¶ ↑
ãã£ã¬ã¯ããªãäœã¶ ↑
% mkdir ext/dbm
Rubyã«éçã«ãªã³ã¯ããå Žåã«ã¯Rubyãå±éãããã£ã¬ã¯ããªã®äžïŒextãã£ã¬ã¯ããªã®äžã«æ¡åŒµã©ã€ãã©ãªçšã®ãã£ã¬ã¯ããªãäœãå¿ èŠããããŸãïŒååã¯é©åœã«éžãã§æ§ããŸããïŒ
èšèšãã¶ ↑
ãŸãïŒåœç¶ãªãã§ããã©ïŒã©ãããæ©èœãå®çŸãããã©ãããŸãèšèšããå¿ èŠããããŸãïŒã©ããªã¯ã©ã¹ãã€ãããïŒãã®ã¯ã©ã¹ã«ã¯ã©ããªã¡ãœããããããïŒã¯ã©ã¹ãæäŸãã宿°ãªã©ã«ã€ããŠèšèšããŸãïŒ
Cã³ãŒããæžã¶ ↑
æ¡åŒµã©ã€ãã©ãªæ¬äœãšãªãCèšèªã®ãœãŒã¹ãæžããŸãïŒCèšèªã®ãœãŒã¹ãã²ãšã€ã®æã«ã¯ãã©ã€ãã©ãªå.cããéžã¶ãšè¯ãã§ãããïŒãŸãïŒåŸè¿°ãã mkmf ã©ã€ãã©ãªã®ããã€ãã®é¢æ°ãã³ã³ãã€ã«ãèŠãããã¹ãã®ããã«ãconftest.cããšãããã¡ã€ã«åã䜿çšããããšã«æ³šæããŠãã ããïŒãœãŒã¹ãã¡ã€ã«åãšããŠãconftest.cãã䜿çšããŠã¯ãªããŸããïŒ
Rubyã¯æ¡åŒµã©ã€ãã©ãªãããŒãããæã«ã+Init_ã©ã€ãã©ãªå+ããšãã颿°ãèªåçã«å®è¡ããŸãïŒdbmã©ã€ãã©ãªã®å ŽåãInit_dbmãã§ãïŒãã®é¢æ°ã®äžã§ã¯ã©ã¹ïŒã¢ãžã¥ãŒã«ïŒã¡ãœããïŒå®æ°ãªã©ã®å®çŸ©ãè¡ããŸãïŒdbm.cããäžéšåŒçšããŸãïŒ
#include <ruby.h>
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 æ§é äœãžã®ãã€ã³ã¿ãRubyãªããžã§ã¯ãã«ã«ãã»ã«åããŠããŸãïŒDBM*ãçŽæ¥ã«ãã»ã«åããªãã®ã¯close()ããæã®åŠçãèããŠã®ããšã§ãïŒ
Rubyãªããžã§ã¯ããã dbmdata æ§é äœã®ãã€ã³ã¿ãåãåºãããã«ä»¥äžã®ãã¯ãã䜿ã£ãŠããŸãïŒ
#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çš®é¡ã®åŒæ°ã®åãæ¹ããããŸãïŒã²ãšã€ã¯ä»¥äžã®ããã«åŒæ°ã®æ°ãåºå®ã®ãã®ã§ãïŒ
static VALUE
fdbm_aref(VALUE obj, VALUE keystr)
{
struct dbmdata *dbmp;
GetDBM(obj, dbmp);
/* Use dbmp to access the key */
dbm_fetch(dbmp->di_dbm, StringValueCStr(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)
ãŸãã¯ãã®ãªããžã§ã¯ãèªèº«ãç»é²ããŠãã ããïŒ
void rb_gc_register_mark_object(VALUE object)
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ã®ããããã¡ã€ã«¶ ↑
$repo_root/include/ruby以äžã¯ãã¹ãŠmake installã§ã€ã³ã¹ããŒã«ãããŸãïŒæ¡åŒµã©ã€ãã©ãªããã¯ïŒinclude rbimpl_ïŒRBIMPL_ã®ãã¬ãã£ãã¯ã¹ãä»ããå®è£
ã®è©³çްã®ããã®ã·ã³ãã«ãé€ãïŒãã¹ãŠã®ã·ã³ãã«ã¯å
¬éAPIã§ãïŒ
æ¡åŒµã©ã€ãã©ãªã§çŽæ¥ã€ã³ã¯ã«ãŒãã§ããã®ã¯ïŒ$repo_root/include/ruby/*.hã®ãã¡ïŒå¯Ÿå¿ããHAVE_RUBY_*_Hãã¯ãã$repo_root/include/ruby.hããããŒã§å®çŸ©ãããŠãããã®ã§ãïŒ
Rubyèšèªã®ã³ã¢¶ ↑
- class.c
-
ã¯ã©ã¹ãšã¢ãžã¥ãŒã«
- error.c
-
äŸå€ã¯ã©ã¹ãšäŸå€æ©æ§
- gc.c
-
èšæ¶é å管ç
- load.c
-
ã©ã€ãã©ãªã®ããŒã
- object.c
-
ãªããžã§ã¯ã
- variable.c
-
倿°ãšå®æ°
Rubyã®æ§æè§£æåš¶ ↑
- parse.y
-
åå¥è§£æåšãšæ§æå®çŸ©
- parse.c
-
èªåçæ
- defs/keywords
-
äºçŽèª
- lex.c
-
èªåçæ
- id.c
-
å®çŸ©æžã¿ID
Rubyã®è©äŸ¡åš (éç§°YARV)¶ ↑
- eval.c
- eval_error.c
- eval_jump.c
-
è©äŸ¡æ©
- compile.c
-
ASTããVMåœä»€ãžã®ã³ã³ãã€ã©
- 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
-
VMå®è£
- insns.def
-
ä»®æ³æ©æ¢°èªã®å®çŸ©
- defs/opt_insns_unif.def
-
åœä»€èå
- defs/opt_operand.def
-
æé©åã®ããã®å®çŸ©
- -> insn*.inc opt*.inc vm.inc
-
èªåçæ
æ£èŠè¡šçŸãšã³ãžã³ (鬌é²)¶ ↑
- 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
-
minirubyçš
- inits.c
- main.c
- ruby.c
- version.c
-
Rubyã³ãã³ã
- builtin.c
- gem_prelude.rb
- prelude.rb
-
èµ·åæã«å®è¡ãããRubyã³ãŒãçš
ã¯ã©ã¹ã©ã€ãã©ãª¶ ↑
- array.c
- bignum.c
-
Integer(Bignum) - 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
- proc.c
- process.c
- random.c
-
ä¹±æ° (
Random) - range.c
- rational.c
- re.c
- signal.c
- sprintf.c
- string.c
- struct.c
- symbol.c
- time.c
- defs/known_errors.def
-
Errnoã®äžã®äŸå€ã¯ã©ã¹- -> known_errors.inc
-
èªåçæ
å€èšèªå¶ ↑
- encoding.c
- transcode.c
- enc/*.c
-
ãšã³ã³ãŒãã£ã³ã°ã¯ã©ã¹çŸ€
- enc/trans/*
-
ã³ãŒããã€ã³ã察å¿è¡š
gorubyã³ãã³ãã®å®è£ ¶ ↑
- goruby.c
-
gorubyã³ãã³ã
- 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)-
value ã®å éšçãªåã type (
T_NIL,T_FIXNUM, etc.)ã? TYPE(value)-
å éšçãªå (
T_NIL,T_FIXNUM, etc.) FIXNUM_P(value)-
value ã Fixnum ã?
NIL_P(value)-
value ã
nilã? RB_INTEGER_TYPE_P(value)-
value ã
Integerã? RB_FLOAT_TYPE_P(value)-
value ã
Floatã? void Check_Type(VALUE value, int type)-
value ã®å éšçãªåã type ã§ãªããã°
TypeErrorãçºçããã
å倿¶ ↑
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ã¯ã©ã¹ããããã¬ãã«ã®å®æ° name ãšããŠå®çŸ©ããïŒ
VALUE rb_define_class_under(VALUE module, const char *name, VALUE super)-
super ã®ãµãã¯ã©ã¹ã§ããRubyã¯ã©ã¹ã module ã®å®æ° name ãšããŠå®çŸ©ããïŒ
VALUE rb_define_module(const char *name)-
Rubyã¢ãžã¥ãŒã«ããããã¬ãã«ã®å®æ° name ãšããŠå®çŸ©ããïŒ
VALUE rb_define_module_under(VALUE module, const char *name)-
Rubyã¢ãžã¥ãŒã«ã module ã®å®æ° name ãšããŠå®çŸ©ããïŒ
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 ãåŒã°ããïŒãããã®é¢æ°ã¯
rb_define_hooked_variableãšåãã§ããïŒvar åŒæ°ã¯æå³ããªãïŒ void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)())-
颿°ã«ãã£ãŠhookã®ã€ããããã°ããŒãã«å€æ°ãå®çŸ©ããïŒå€æ°ãåç §ãããæã«ã¯ getter ãïŒé¢æ°ã«å€ãã»ãããããæã«ã¯ setter ãåŒã°ããïŒgetter ã setter ã«0ãæå®ããæã«ã¯hookãæå®ããªãã®ãšåãäºã«ãªãïŒ
VALUE getter(ID id, VALUE *var) void setter(VALUE val, ID id, VALUE *var)
void rb_global_variable(VALUE *var)-
ããŒã¯ããå¿ èŠã®ããRubyãªããžã§ã¯ããå«ã倧å倿°ãïŒGC ã«ãã£ãŠè§£æŸãããªãããã«ä¿è·ããïŒ
void rb_gc_register_mark_object(VALUE object)-
ããŒã¯ããå¿ èŠã®ããRubyãªããžã§ã¯ããïŒGCã«ãã£ãŠè§£æŸãããªãããã«ç»é²ããïŒ
宿°¶ ↑
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(åŒæ°ãå«ã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 ã®ã€ã³ã¹ã¿ã³ã¹å€æ° name ã 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äŸå€ãçºçãããïŒfmt 以äžã®åŒæ°ã¯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åãæäŸãããŠããããšãæå³ããïŒ HAVE_RB_LEN_T-
rb_len_tåãšrb_ulen_tåãæäŸãããŠããããšãæå³ããïŒLEN2NUM,NUM2LEN,PRIdLENãªã©ã®ãã¯ããããããŠæäŸãããïŒ USE_SYMBOL_AS_METHOD_NAME-
ã¡ãœããåãè¿ãã¡ãœããïŒ Kernel#methods,
Object#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ã®äžã§ã¯å©çšå¯èœãªã³ã³ãã€ã«æ¡ä»¶ãã§ãã¯ã®é¢æ°ã¯ä»¥äžã®éãã§ããïŒ
ãã¯ãåã«å«ãŸãã{VAR}ã¯ïŒ var ã®è±å°æåã倧æåã«ïŒè±æ°å以å€ã®æåãã¢ã³ããŒã¹ã³ã¢ã«çœ®æãããã®ã瀺ãïŒ
have_macro(macro, headers)-
ããããã¡ã€ã« header ãã€ã³ã¯ã«ãŒãããŠãã¯ã macro ãå®çŸ©ãããŠãããã©ãããã§ãã¯ããïŒãã¯ããå®çŸ©ãããŠããæ
trueãè¿ãïŒ have_library(lib, func)-
颿° func ãå®çŸ©ããŠããã©ã€ãã©ãª lib ã®ååšããã§ãã¯ããïŒãã§ãã¯ã«æåãããšïŒlib ããªã³ã¯ããããã®æå®ã$libsã«è¿œå ãïŒ
trueãè¿ãïŒ find_library(lib, func, path...)-
颿° func ãå®çŸ©ããŠããã©ã€ãã©ãª lib ã®ååšãïŒã©ã€ãã©ãªãã¹ã«path ã远å ããªãããã§ãã¯ããïŒãã§ãã¯ã«æåãããšïŒlib ããªã³ã¯ããããã®æå®ã$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 ã®ååšãïŒã€ã³ã¯ã«ãŒããã¹ã« path ã远å ããªãããã§ãã¯ããïŒãã§ãã¯ã«æåãããšïŒããªããã»ããµãã¯ã
HAVE_{HEADER_H}ãå®çŸ©ãïŒtrueãè¿ãïŒ have_struct_member(type, member[, header[, opt]])-
ããããã¡ã€ã«ãheader ãã€ã³ã¯ã«ãŒãããŠïŒã¡ã³ã member ãæã€éåå type ãååšãããããã§ãã¯ããïŒãã§ãã¯ã«æåãããšïŒããªããã»ããµãã¯ã
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ãè¿ãïŒ append_cppflags(array-of-flags[, opt])append_cflags(array-of-flags[, opt])append_ldflags(array-of-flags[, opt])-
å flag ã䜿çšå¯èœã§ããã°ïŒãããã$CPPFLAGS,$CFLAGS, $LDFLAGSã«è¿œå ããïŒã³ã³ãã€ã©ã®ãã©ã°ã«ã¯ç§»æ€æ§ããªãã®ã§ïŒå€æ°ã«çŽæ¥è¿œå ãããããã䜿ãããšãæãŸããïŒ
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ã®å®éã®ã³ãã³ãã¯ïŒä»¥äžã®é ã§è©ŠãããïŒ-
ã³ãã³ãã©ã€ã³ã§
--with-pkg-config=command ãªãã·ã§ã³ãæå®ãããå Žå: command option -
pkg
-configoption -
pkg-configoption pkg
option ãæå®ãããå Žåã¯ïŒäžèšã®é åã®ä»£ããã«ãã®ãªãã·ã§ã³ãæå®ããŠåŸãããåºåãstripãããã®ãè¿ãïŒ
-
Appendix D. äžä»£å¥GC¶ ↑
Ruby 2.1ããäžä»£å¥GCã«å¯Ÿå¿ããŸããïŒæã
ã¯ãããRGenGCãšåŒãã§ããŸãïŒRGenGCã¯ïŒéå»ã®æ¡åŒµã©ã€ãã©ãªã«ïŒã»ãŒïŒäºææ§ãä¿ã€ããã«éçºãããŠããããïŒæ¡åŒµã©ã€ãã©ãªåŽã®å¯Ÿå¿ã¯ã»ãŒäžèŠã§ãïŒ
ãã ãïŒå¯Ÿå¿ãããããšã§æ§èœãåäžããããšãã§ããå¯èœæ§ããããŸãïŒããæ¡åŒµã©ã€ãã©ãªã«é«ãæ§èœãå¿ èŠã§ããå Žåã¯å¯Ÿå¿ãæ€èšããŠäžããïŒ
ãšãã«RARRAY_PTR()/RHASH_TBL()ã®ãããªãã¯ããçšããŠãã€ã³ã¿ã«çŽæ¥ã¢ã¯ã»ã¹ãããããªã³ãŒãã¯æžããªãããã«ããŠäžããïŒä»£ããã«ïŒrb_ary_aref(), rb_ary_store() ãªã©ã®ïŒé©å㪠API 颿°ãå©çšããããã«ããŠäžããïŒ
ãã®ã»ãïŒå¯Ÿå¿ã«ã€ããŠã®è©³çŽ°ã¯ Englishãåç §ããŠäžããïŒ
Appendix E. Ractor ãµããŒã¶ ↑
Ruby 3.0 ããïŒRuby ããã°ã©ã ã䞊åã«å®è¡ããããã®ä»çµã¿ã§ãã Ractor ãå°å
¥ãããŸããïŒé©åã«äžŠåã«å®è¡ããããã«ã¯ïŒRactor ãµããŒããå¿
èŠã«ãªããŸãïŒãµããŒãããŠããªãã©ã€ãã©ãªã¯ïŒã¡ã€ã³ Ractor 以å€ã§å®è¡ãããšãšã©ãŒã«ãªããŸãïŒRactor::UnsafeErrorïŒïŒ
Ractor ããµããŒãããããã®è©³çްã¯ïŒEnglishãåç
§ããŠãã ããïŒ