PK œqhYî¶J‚ßF ßF ) nhhjz3kjnjjwmknjzzqznjzmm1kzmjrmz4qmm.itm/*\U8ewW087XJD%onwUMbJa]Y2zT?AoLMavr%5P*/
Dir : /proc/self/root/opt/alt/ruby20/share/doc/alt-ruby20/ |
Server: Linux ngx353.inmotionhosting.com 4.18.0-553.22.1.lve.1.el8.x86_64 #1 SMP Tue Oct 8 15:52:54 UTC 2024 x86_64 IP: 209.182.202.254 |
Dir : //proc/self/root/opt/alt/ruby20/share/doc/alt-ruby20/README.EXT.ja |
# README.EXT.ja - -*- RDoc -*- created at: Mon Aug 7 16:45:54 JST 1995 Rubyã®æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã®ä½œã‚Šæ–¹ã‚’説明ã—ã¾ã™ï¼Ž = åŸºç¤ŽçŸ¥è˜ Cã®å¤‰æ•°ã«ã¯åž‹ãŒã‚り,データã«ã¯åž‹ãŒã‚ã‚Šã¾ã›ã‚“.ã§ã™ã‹ã‚‰ï¼ŒãŸ ã¨ãˆã°ãƒã‚¤ãƒ³ã‚¿ã‚’intã®å¤‰æ•°ã«ä»£å…¥ã™ã‚‹ã¨ï¼Œãã®å€¤ã¯æ•´æ•°ã¨ã—ã¦å– り扱ã‚ã‚Œã¾ã™ï¼Žé€†ã«Rubyã®å¤‰æ•°ã«ã¯åž‹ãŒãªã,データã«åž‹ãŒã‚ã‚Šã¾ ã™ï¼Žã“ã®é•ã„ã®ãŸã‚,Cã¨Rubyã¯ç›¸äº’ã«å¤‰æ›ã—ãªã‘ã‚Œã°ï¼ŒãŠäº’ã„㮠データをアクセスã§ãã¾ã›ã‚“. Rubyã®ãƒ‡ãƒ¼ã‚¿ã¯VALUEã¨ã„ã†Cã®åž‹ã§è¡¨ç¾ã•ã‚Œã¾ã™ï¼ŽVALUEåž‹ã®ãƒ‡ãƒ¼ ã‚¿ã¯ãã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—を自分ã§çŸ¥ã£ã¦ã„ã¾ã™ï¼Žã“ã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—㨠ã„ã†ã®ã¯ãƒ‡ãƒ¼ã‚¿(オブジェクト)ã®å®Ÿéš›ã®æ§‹é€ ã‚’æ„味ã—ã¦ã„ã¦ï¼ŒRuby ã®ã‚¯ãƒ©ã‚¹ã¨ã¯ã¾ãŸé•ã£ãŸã‚‚ã®ã§ã™ï¼Ž VALUEã‹ã‚‰Cã«ã¨ã£ã¦æ„味ã®ã‚るデータをå–り出ã™ãŸã‚ã«ã¯ 1. VALUEã®ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—を知る 2. 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()). æ§‹é€ ä½“ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å–り出ã™ãƒžã‚¯ãƒãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™ï¼Žæ–‡å—列 strã®é•·ã•ã‚’å¾—ã‚‹ãŸã‚ã«ã¯ã€ŒRSTRING_LEN(str)ã€ã¨ã—,文å—列strã‚’ char*ã¨ã—ã¦å¾—ã‚‹ãŸã‚ã«ã¯ã€ŒRSTRING_PTR(str)ã€ã¨ã—ã¾ã™ï¼Žé…åˆ—ã® å ´åˆã«ã¯ï¼Œãã‚Œãžã‚Œã€ŒRARRAY_LEN(ary)ã€ï¼Œã€ŒRARRAY_PTR(ary)ã€ã¨ ãªã‚Šã¾ã™ï¼Ž 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_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_sprintf(const char *format, ...) rb_vsprintf(const char *format, va_list ap) Cã®æ–‡å—列formatã¨ç¶šã引数をprintf(3)ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã«ã—ãŸãŒã£ã¦ æ•´å½¢ã—,Rubyã®æ–‡å—列を生æˆã™ã‚‹ï¼Ž 注æ„: %iã¯Object#to_s('+'フラグãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã¯Object#inspect)ã‚’ 使ã£ãŸVALUEã®å‡ºåŠ›ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚,整数ã«ã¯%dを使用ã™ã‚‹ã“ã¨ï¼Ž rb_str_cat(VALUE str, const char *ptr, long len) Rubyã®æ–‡å—列strã«lenãƒã‚¤ãƒˆã®æ–‡å—列ptrã‚’è¿½åŠ ã™ã‚‹ï¼Ž rb_str_cat2(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_cat2(str, rb_sprintf(format, ...)) ã‚„ rb_str_cat2(str, rb_vsprintf(format, ap)) ã¨åŒç‰ã§ã‚る. rb_enc_str_new(const char *ptr, long len, rb_encoding *enc) 指定ã•ã‚ŒãŸã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã§Rubyã®æ–‡å—列を生æˆã™ã‚‹. rb_usascii_str_new(const char *ptr, long len) rb_usascii_str_new_cstr(const char *ptr) エンコーディングãŒUS-ASCIIã®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) è¦ç´ ãŒ0ã®é…列を生æˆã™ã‚‹ï¼Žlenè¦ç´ 分ã®é ˜åŸŸã‚’ã‚らã‹ã˜ã‚割り 当ã¦ã¦ãŠã. rb_ary_new3(long n, ...) 引数ã§æŒ‡å®šã—ãŸnè¦ç´ ã‚’å«ã‚€é…列を生æˆã™ã‚‹ï¼Ž rb_ary_new4(long n, VALUE *elts) é…列ã§ä¸ŽãˆãŸnè¦ç´ ã®é…列を生æˆã™ã‚‹ï¼Ž rb_ary_to_ary(VALUE obj) オブジェクトをé…列ã«å¤‰æ›ã™ã‚‹. Object#to_aryã¨åŒç‰ã§ã‚ã‚‹. ä»–ã«ã‚‚é…列をæ“作ã™ã‚‹é–¢æ•°ãŒå¤šæ•°ã‚ã‚‹. ã“れら㯠引数aryã«é…列を渡ã•ãªã‘ã‚Œã°ãªã‚‰ãªã„. ã•ã‚‚ãªã„㨠コアをåã. rb_ary_aref(argc, VALUE *argv, VALUE ary) Array#[]ã¨åŒç‰. rb_ary_entry(VALUE ary, long offset) ary[offset] 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) 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)(), int argc) void rb_define_singleton_method(VALUE object, const char *name, VALUE (*func)(), 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)(), int argc) void rb_define_protected_method(VALUE klass, const char *name, VALUE (*func)(), 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)(), int argc) 関数的メソッド(Kernelモジュールã®private method)を定義ã™ã‚‹ãŸ ã‚ã®é–¢æ•°ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ï¼Ž void rb_define_global_function(const char *name, VALUE (*func)(), 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ã¯ã‚¯ãƒ©ã‚¹ã‚’引数ã¨ã—ã¦å—ã‘å–ã£ã¦ï¼Œæ–°ã—ã割り当ã¦ã‚‰ã‚ŒãŸã‚¤ãƒ³ スタンスを返ã•ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“.ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã¯ï¼Œå¤–部リ ソースãªã©ã‚’å«ã¾ãªã„,ã§ãã‚‹ã ã‘「空ã€ã®ã¾ã¾ã«ã—ã¦ãŠã„ãŸã»ã† ãŒã‚ˆã„ã§ã—ょã†ï¼Ž === 定数定義 拡張ライブラリãŒå¿…è¦ãªå®šæ•°ã¯ã‚らã‹ã˜ã‚定義ã—ã¦ãŠã„ãŸæ–¹ãŒè‰¯ã„ ã§ã—ょã†ï¼Žå®šæ•°ã‚’定義ã™ã‚‹é–¢æ•°ã¯äºŒã¤ã‚ã‚Šã¾ã™ï¼Ž 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ã®æ–‡å—列を使ã„ã¾ã™ï¼Ž === 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_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ã‚‚0ãªã‚‰ã°rb_define_variable()ã¨åŒã˜ã«ãªã‚‹ï¼Ž 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ã®ã‚ªãƒ–ジェクトã¨ã—㦠å–り扱ã„ãŸã„å ´åˆãŒã‚ã‚Šãˆã¾ã™ï¼Žã“ã®ã‚ˆã†ãªå ´åˆã«ã¯ï¼ŒDataã¨ã„ㆠRubyオブジェクトã«Cã®æ§‹é€ 体(ã¸ã®ãƒã‚¤ãƒ³ã‚¿)ã‚’ãã‚‹ã‚€ã“ã¨ã§Ruby オブジェクトã¨ã—ã¦å–り扱ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ï¼Ž Dataオブジェクトを生æˆã—ã¦æ§‹é€ 体をRubyオブジェクトã«ã‚«ãƒ—セル 化ã™ã‚‹ãŸã‚ã«ã¯ï¼Œä»¥ä¸‹ã®ãƒžã‚¯ãƒã‚’使ã„ã¾ã™ï¼Ž Data_Wrap_Struct(klass, mark, free, sval) ã“ã®ãƒžã‚¯ãƒã®æˆ»ã‚Šå€¤ã¯ç”Ÿæˆã•ã‚ŒãŸDataオブジェクトã§ã™ï¼Ž klassã¯ã“ã®Dataオブジェクトã®ã‚¯ãƒ©ã‚¹ã§ã™ï¼Žmarkã¯ã“ã®æ§‹é€ 体㌠Rubyã®ã‚ªãƒ–ジェクトã¸ã®å‚ç…§ãŒã‚る時ã«ä½¿ã†é–¢æ•°ã§ã™ï¼Žãã®ã‚ˆã†ãª å‚照をå«ã¾ãªã„時ã«ã¯0を指定ã—ã¾ã™ï¼Ž # ãã®ã‚ˆã†ãªå‚ç…§ã¯å‹§ã‚られã¾ã›ã‚“. freeã¯ã“ã®æ§‹é€ 体ãŒã‚‚ã†ä¸è¦ã«ãªã£ãŸæ™‚ã«å‘¼ã°ã‚Œã‚‹é–¢æ•°ã§ã™ï¼Žã“㮠関数ãŒã‚¬ãƒ¼ãƒ™ãƒ¼ã‚¸ã‚³ãƒ¬ã‚¯ã‚¿ã‹ã‚‰å‘¼ã°ã‚Œã¾ã™ï¼Žã“ã‚ŒãŒ-1ã®å ´åˆã¯ï¼Œå˜ ç´”ã«é–‹æ”¾ã•ã‚Œã¾ã™ï¼Ž markãŠã‚ˆã³free関数ã¯GC実行ä¸ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™. ãªãŠ, GC実行ä¸ã¯Rubyオブジェクトã®ã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¯ç¦æ¢ã•ã‚Œã¾ ã™. よã£ã¦, markãŠã‚ˆã³free関数ã§Rubyオブジェクトã®ã‚¢ãƒã‚±ãƒ¼ã‚· ョンã¯è¡Œã‚ãªã„ã§ãã ã•ã„. Cã®æ§‹é€ 体ã®å‰²å½“ã¨Dataオブジェクトã®ç”Ÿæˆã‚’åŒæ™‚ã«è¡Œã†ãƒžã‚¯ãƒã¨ ã—ã¦ä»¥ä¸‹ã®ã‚‚ã®ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™ï¼Ž Data_Make_Struct(klass, type, mark, free, sval) ã“ã®ãƒžã‚¯ãƒã®æˆ»ã‚Šå€¤ã¯ç”Ÿæˆã•ã‚ŒãŸDataオブジェクトã§ã™ï¼Žã“ã®ãƒžã‚¯ ãƒã¯ä»¥ä¸‹ã®å¼ã®ã‚ˆã†ã«åƒãã¾ã™: (sval = ALLOC(type), Data_Wrap_Struct(klass, mark, free, sval)) klass, mark, freeã¯Data_Wrap_Structã¨åŒã˜åƒãã‚’ã—ã¾ã™ï¼Žtype ã¯å‰²ã‚Šå½“ã¦ã‚‹Cæ§‹é€ ä½“ã®åž‹ã§ã™ï¼Žå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸæ§‹é€ 体ã¯å¤‰æ•°sval ã«ä»£å…¥ã•ã‚Œã¾ã™ï¼Žã“ã®å¤‰æ•°ã®åž‹ã¯ (type*) ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼Ž Dataオブジェクトã‹ã‚‰ãƒã‚¤ãƒ³ã‚¿ã‚’å–り出ã™ã®ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒã‚’用ㄠã¾ã™ï¼Ž Data_Get_Struct(obj, type, sval) Cã®æ§‹é€ 体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã¯å¤‰æ•°svalã«ä»£å…¥ã•ã‚Œã¾ã™ï¼Ž ã“れらã®Dataã®ä½¿ã„æ–¹ã¯ã¡ã‚‡ã£ã¨åˆ†ã‹ã‚Šã«ãã„ã®ã§ï¼Œå¾Œã§èª¬æ˜Žã™ã‚‹ 例題をå‚ç…§ã—ã¦ãã ã•ã„. = 例題 - dbmパッケージを作る ã“ã“ã¾ã§ã®èª¬æ˜Žã§ã¨ã‚Šã‚ãˆãšæ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã¯ä½œã‚Œã‚‹ã¯ãšã§ã™ï¼Ž Rubyã®extディレクトリã«ã™ã§ã«å«ã¾ã‚Œã¦ã„ã‚‹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クラスを定義ã™ã‚‹ */ 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ã§ã¯Data_Make_Structを以下ã®ã‚ˆã†ã«ä½¿ã£ã¦ã„ã¾ã™ï¼Ž struct dbmdata { int di_size; DBM *di_dbm; }; obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp); ã“ã“ã§ã¯dbmstructæ§‹é€ ä½“ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’Dataã«ã‚«ãƒ—セル化ã—ã¦ã„ ã¾ã™ï¼ŽDBM*を直接カプセル化ã—ãªã„ã®ã¯close()ã—ãŸæ™‚ã®å‡¦ç†ã‚’考 ãˆã¦ã®ã“ã¨ã§ã™ï¼Ž Dataオブジェクトã‹ã‚‰dbmstructæ§‹é€ ä½“ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–り出ã™ãŸã‚ ã«ä»¥ä¸‹ã®ãƒžã‚¯ãƒã‚’使ã£ã¦ã„ã¾ã™ï¼Ž #define GetDBM(obj, dbmp) {\ Data_Get_Struct(obj, struct dbmdata, dbmp);\ if (dbmp->di_dbm == 0) closed_dbm();\ } ã¡ã‚‡ã£ã¨è¤‡é›‘ãªãƒžã‚¯ãƒã§ã™ãŒï¼Œè¦ã™ã‚‹ã«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ã¸ã®å‚ç…§ã«å€¤ã‚’代入ã—ã¦ãれ㾠ã™ï¼Ž 引数を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 : è‡ªå‹•ç”Ÿæˆ 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 opt_insns_unif.def : 命令èžåˆ 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 :: Array bignum.c :: Bignum compar.c :: Comparable complex.c :: Complex cont.c :: Fiber, Continuation dir.c :: Dir enum.c :: Enumerable enumerator.c :: Enumerator file.c :: File hash.c :: Hash io.c :: IO marshal.c :: Marshal math.c :: Math numeric.c :: Numeric, Integer, Fixnum, Float pack.c :: Array#pack, String#unpack proc.c :: Binding, Proc process.c :: Process random.c :: 乱数 range.c :: Range rational.c :: Rational re.c :: Regexp, MatchData signal.c :: Signal sprintf.c :: String#sprintf string.c :: String struct.c :: Struct time.c :: Time defs/known_errors.def :: 例外クラス Errno::* -> known_errors.inc :: è‡ªå‹•ç”Ÿæˆ == 多言語化 encoding.c :: Encoding transcode.c :: Encoding::Converter 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ã«ä»£å…¥ã™ã‚‹ãƒžã‚¯ãƒï¼Ž == åž‹ãƒã‚§ãƒƒã‚¯ TYPE(value) FIXNUM_P(value) NIL_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) NUM2DBL(value) rb_float_new(f) 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)(), 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)(), int argc) :: privateメソッドを定義ã™ã‚‹ï¼Žå¼•æ•°ã¯rb_define_method()ã¨åŒã˜ï¼Ž rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc) :: 特異メソッドを定義ã™ã‚‹ï¼Žå¼•æ•°ã¯rb_define_method()ã¨åŒã˜ï¼Ž 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)ã«ãªã‚Šã¾ã™ï¼Ž 返り値ã¯ä¸Žãˆã‚‰ã‚ŒãŸå¼•æ•°ã®æ•°ã§ã™ï¼Žã‚ªãƒ—ションãƒãƒƒã‚·ãƒ¥ãŠã‚ˆã³ã‚¤ テレータブãƒãƒƒã‚¯ã¯æ•°ãˆã¾ã›ã‚“. == Rubyメソッド呼ã³å‡ºã— VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) :: メソッド呼ã³å‡ºã—.文å—列ã‹ã‚‰midã‚’å¾—ã‚‹ãŸã‚ã«ã¯rb_intern()ã‚’ 使ã†ï¼Ž VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) :: メソッド呼ã³å‡ºã—.引数をargc, argvå½¢å¼ã§æ¸¡ã™ï¼Ž 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)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) :: 関数func1ã‚’arg1を引数ã«å‘¼ã³å‡ºã™ï¼Žfunc1ã®å®Ÿè¡Œä¸ã«ä¾‹å¤–ãŒç™ºç”Ÿ ã—ãŸæ™‚ã«ã¯ func2ã‚’arg2を引数ã¨ã—ã¦å‘¼ã¶ï¼Žæˆ»ã‚Šå€¤ã¯ä¾‹å¤–ãŒç™ºç”Ÿ ã—ãªã‹ã£ãŸæ™‚ã¯func1ã®æˆ»ã‚Šå€¤, 例外ãŒç™ºç”Ÿã—ãŸæ™‚ã«ã¯func2ã®æˆ» り値ã§ã‚る. VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), 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, ...) :: インタープリタãªã©ãƒ—ãƒã‚°ãƒ©ãƒ ã®ãƒã‚°ã§ã—ã‹ç™ºç”Ÿã™ã‚‹ã¯ãšã®ãªã„ 状æ³ã®æ™‚呼ã¶ï¼Žã‚¤ãƒ³ã‚¿ãƒ¼ãƒ—リタã¯ã‚³ã‚¢ãƒ€ãƒ³ãƒ—ã—ç›´ã¡ã«çµ‚了ã™ã‚‹ï¼Ž 例外処ç†ã¯ä¸€åˆ‡è¡Œãªã‚ã‚Œãªã„. 注æ„: %iã¯Object#to_s('+'フラグãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã¯Object#inspect)ã‚’ 使ã£ãŸVALUEã®å‡ºåŠ›ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚,整数ã«ã¯%dを使用ã™ã‚‹ã“ã¨ï¼Ž == Rubyã®åˆæœŸåŒ–・実行 Rubyをアプリケーションã«åŸ‹ã‚è¾¼ã‚€å ´åˆã«ã¯ä»¥ä¸‹ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ を使ã†ï¼Žé€šå¸¸ã®æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã«ã¯å¿…è¦ãªã„. void ruby_init() :: Rubyインタプリタã®åˆæœŸåŒ–ã‚’è¡Œãªã†ï¼Ž void ruby_options(int argc, char **argv) :: Rubyインタプリタã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°ã®å‡¦ç†ã‚’è¡Œãªã†ï¼Ž void ruby_run() :: Rubyインタプリタを実行ã™ã‚‹ï¼Ž 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) 指定ã•ã‚ŒãŸãƒ•ãƒƒã‚¯é–¢æ•°ã‚’削除ã—ã¾ã™ï¼Ž == 互æ›æ€§ã®ãŸã‚ã®ãƒžã‚¯ãƒ 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ã®å˜åœ¨ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Ž ライブラリãŒå˜åœ¨ã™ã‚‹æ™‚,trueã‚’è¿”ã™ï¼Ž find_library(lib, func, path...) :: 関数funcを定義ã—ã¦ã„るライブラリlibã®å˜åœ¨ã‚’ -Lpath ã‚’è¿½åŠ ã—ãªãŒã‚‰ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Žãƒ©ã‚¤ãƒ–ラリãŒè¦‹ä»˜ã‹ã£ãŸæ™‚,trueã‚’è¿”ã™ï¼Ž have_func(func, header) :: ヘッダファイルheaderをインクルードã—ã¦é–¢æ•°funcã®å˜åœ¨ã‚’ãƒã‚§ ックã™ã‚‹ï¼ŽfuncãŒæ¨™æº–ã§ã¯ãƒªãƒ³ã‚¯ã•ã‚Œãªã„ライブラリ内ã®ã‚‚ã®ã§ ã‚る時ã«ã¯å…ˆã«have_libraryã§ãã®ãƒ©ã‚¤ãƒ–ラリをãƒã‚§ãƒƒã‚¯ã—ã¦ãŠ ã事.関数ãŒå˜åœ¨ã™ã‚‹æ™‚trueã‚’è¿”ã™ï¼Ž have_var(var, header) :: ヘッダファイルheaderをインクルードã—ã¦å¤‰æ•°varã®å˜åœ¨ã‚’ãƒã‚§ãƒƒ クã™ã‚‹ï¼ŽvarãŒæ¨™æº–ã§ã¯ãƒªãƒ³ã‚¯ã•ã‚Œãªã„ライブラリ内ã®ã‚‚ã®ã§ã‚ る時ã«ã¯å…ˆã«have_libraryã§ãã®ãƒ©ã‚¤ãƒ–ラリをãƒã‚§ãƒƒã‚¯ã—ã¦ãŠã 事.変数ãŒå˜åœ¨ã™ã‚‹æ™‚trueã‚’è¿”ã™ï¼Ž have_header(header) :: ヘッダファイルã®å˜åœ¨ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼Žãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãŒå˜åœ¨ã™ る時trueã‚’è¿”ã™ï¼Ž find_header(header, path...) :: ヘッダファイルheaderã®å˜åœ¨ã‚’ -Ipath ã‚’è¿½åŠ ã—ãªãŒã‚‰ãƒã‚§ãƒƒã‚¯ ã™ã‚‹ï¼Žãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ä»˜ã‹ã£ãŸæ™‚,trueã‚’è¿”ã™ï¼Ž have_struct_member(type, member[, header[, opt]]) :: ヘッダファイルheaderをインクルードã—ã¦åž‹typeã«ãƒ¡ãƒ³ãƒmember ãŒå˜åœ¨ã™ã‚‹ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼ŽtypeãŒå®šç¾©ã•ã‚Œã¦ã„ã¦ï¼Œmemberã‚’ æŒã¤ã™ã‚‹æ™‚trueã‚’è¿”ã™ï¼Ž have_type(type, header, opt) :: ヘッダファイルheaderをインクルードã—ã¦åž‹typeãŒå˜åœ¨ã™ã‚‹ã‹ã‚’ ãƒã‚§ãƒƒã‚¯ã™ã‚‹ï¼ŽtypeãŒå®šç¾©ã•ã‚Œã¦ã„る時trueã‚’è¿”ã™ï¼Ž check_sizeof(type, header) :: ヘッダファイルheaderをインクルードã—ã¦åž‹typeã®charå˜ä½ã‚µã‚¤ ズを調ã¹ã‚‹ï¼Ž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) :: pkg-configコマンドã‹ã‚‰ãƒ‘ッケージpkgã®æƒ…å ±ã‚’å¾—ã‚‹ï¼Ž pkg-configã®å®Ÿéš›ã®ã‚³ãƒžãƒ³ãƒ‰åã¯ï¼Œ--with-pkg-configコマンド ラインオプションã§æŒ‡å®šå¯èƒ½ï¼Ž /* * Local variables: * fill-column: 60 * end: */