{"id":1696,"date":"2008-02-09T06:29:10","date_gmt":"2008-02-08T22:29:10","guid":{"rendered":"http:\/\/ihower.idv.tw\/blog\/archives\/1696"},"modified":"2011-04-09T02:17:19","modified_gmt":"2011-04-08T18:17:19","slug":"ruby-class-instance-variables","status":"publish","type":"post","link":"https:\/\/ihower.tw\/blog\/1696-ruby-class-instance-variables","title":{"rendered":"\u4e00\u4e9b Ruby Dynamic Features \u8a18\u4e8b  (1) OOP"},"content":{"rendered":"<p>\u8d81\u904e\u5e74\u628a The Ruby Way \u62ff\u8d77\u4f86\u8b80\u4e00\u8b80\uff0c\u5927\u90e8\u982d\u4e00\u672c\u6c92\u8fa6\u6cd5\u5f9e\u982d\u5ff5\u5230\u5c3e\uff0c\u5c31\u6311\u4e86\u6700\u91cd\u8981\u7684\u7b2c11\u7ae0( OOP and Dynamic Features in Ruby) \u4f86\u5ff5\u3002\u9019\u500b\u4e3b\u984c\u503c\u5f97\u95b1\u8b80\u7684\u9084\u6709 Ruby for Rails \u7b2c13\u7ae0(Ruby dynamics) \u8ddf\u6700\u8fd1\u51fa\u7684 Advanced Rails \u4e00\u66f8\u7b2c1\u7ae0(Foundational Techniques)\uff0c\u56e0\u6b64\u9019\u5e7e\u7bc7\u6587\u6211\u9084\u6703\u4fee\u4fee\u6539\u6539\u5c31\u662f\u4e86\u3002<\/p>\n<p><!--more--><\/p>\n<h2>A &#8220;Fancy&#8221; Constructor<\/h2>\n<pre>\r\nclass Foo\r\n attr_accessor :a,:b\r\n def initialize(&amp;block) \r\n  instance_eval &amp;block\r\n end\r\nend<\/pre>\n<p>\u65bc\u662f\u53ef\u4ee5\u50b3\u5165 block \u4f86\u4f7f\u7528\u5efa\u69cb\u5f0f<\/p>\n<pre>\r\nbar = Foo.new do\r\n self.a = 1\r\n self.b = 2\r\nend<\/pre>\n<h2>class instance variables<\/h2>\n<p>\u56e0\u70ba Ruby \u7684 class \u4e5f\u662f\u7269\u4ef6(\u5373 Object \u7684 instance )\uff0c\u6240\u4ee5\u9664\u4e86 class variable \u8ddf instance variable \u4e4b\u5916\uff0c\u9084\u6709\u7a2e\u8b8a\u6578\u53eb\u505a class instance variables (\u5373 class Class \u7684 instance variable \u53eb\u505a the class instance variable)\u3002<\/p>\n<pre>\r\nclass Foo\r\n@@var =1 # \u9019\u662f class variable\r\n@var = 2 # \u9019\u662f class instance variable\r\nattr_accessor :var #\u9019\u5c07\u5b9a\u7fa9\u51fa instance variable\r\n\r\nclass &lt;&lt; self\r\n attr_accessor :var2 #\u9019\u5c07\u5b9a\u7fa9\u51fa class instance variable\r\nend\r\n\r\n def initialize\r\n  @var,@var2 = 4,5 # \u9019\u662f instance variable\r\n end\r\n\r\n def mymethod1\r\n  puts @@var # 1 \u9019\u662f class variable\r\n  puts @var # 4  \u9019\u662f instance variable\r\n  puts @var2 # 5  \u9019\u662f instance variable\r\n end\r\n\r\n def Foo.classmethod\r\n  puts @@var # 1 \u9019\u662f class variable\r\n  puts @var # 2 \u9019\u662f class instance variable\r\n  Foo.var2 = 6 # \u9019\u4e5f\u662f class instance variable\r\nend\r\nend\r\n\r\nclass BarOne &lt; Foo\r\n  self.var2 = 7\r\nend\r\n\r\nclass BarTwo &lt; Foo\r\n  self.var2 = 8\r\nend\r\n\r\nFoo.classmethod\r\nputs Foo.var2 # 6\r\nputs BarOne.var2 #7\r\nputs BarTwo.var2 #8\r\n\r\n<\/pre>\n<p> class instance variable \u8ddf class variable \u6700\u5927\u7684\u4e0d\u540c\u5728\u65bc\uff0cclass variable \u5728\u6574\u500b class \u7e7c\u627f\u9ad4\u7cfb\u90fd\u662f\u6307\u540c\u4e00\u500b\uff0c\u800c class instance variable \u5247\u662f\u5404\u500b class \u7686\u4e0d\u540c\uff0c\u56e0\u70ba\u5982\u6b64 class instance variable \u5f88\u591a\u6642\u5019\u6bd4 class variable \u597d\u7528\uff0c\u50cf\u662f\u53c3\u6578\u5316\u7684 classes\u3002<\/p>\n<h2>const_get<\/h2>\n<p> const_get \u53ef\u4ee5\u5f9e\u540d\u7a31\u62ff\u5230\u5e38\u6578:<\/p>\n<pre>\r\n str = \"PI\"\r\n Math.const_get(str) # \u5f97\u5230 Math::PI\r\n<\/pre>\n<p>\u800c\u5728 Ruby \u88e1\u9762\u6240\u6709\u7684 class \u4e5f\u90fd\u662f Object \u88e1\u7684\u5e38\u6578\uff0c\u6240\u4ee5\u8981\u7531\u540d\u7a31\u62ff\u5230 class \u662f\u9019\u6a23\u5beb : <\/p>\n<pre>\r\n classname = \"Array\"\r\n klass = Object.const_get(classname) # \u62ff\u5230 Array\r\n arr = klass.new(4,1) # [1,1,1,1]\r\n<\/pre>\n<h2>binding<\/h2>\n<p>\u5229\u7528 eval \u8ddf\u5167\u5efa\u7684 Binding \u7269\u4ef6\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u7576\u4e0b\u7684 context \u50b3\u5230\u51fd\u6578\u88e1\u9762\uff0c\u5efa\u7acb\u51fa\u8207\u672c\u4f86\u7684 scope \u4e00\u6a23\u7684\u57f7\u884c\u74b0\u5883(\u56e0\u6b64\u9019\u88e1\u53ef\u4ee5\u5b58\u53d6\u5230 local variables )\u3002<\/p>\n<pre>\r\ndef print_var( var_name, binding )\r\n eval \"puts #{var_name}\", binding\r\nend\r\n\r\nfoobar = 10\r\nprint_var( 'foobar' , binding )\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8d81\u904e\u5e74\u628a The Ruby Way \u62ff\u8d77\u4f86\u8b80\u4e00\u8b80\uff0c\u5927\u90e8\u982d\u4e00\u672c\u6c92\u8fa6\u6cd5\u5f9e\u982d\u5ff5\u5230\u5c3e\uff0c\u5c31\u6311\u4e86\u6700\u91cd\u8981\u7684\u7b2c11\u7ae0( OOP &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/ihower.tw\/blog\/1696-ruby-class-instance-variables\" class=\"more-link\">\u95b1\u8b80\u5168\u6587<span class=\"screen-reader-text\">\u3008\u4e00\u4e9b Ruby Dynamic Features \u8a18\u4e8b  (1) OOP\u3009<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[5,31],"tags":[],"class_list":["post-1696","post","type-post","status-publish","format-standard","hentry","category-programming","category-ruby","entry"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1q6tG-rm","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/1696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/comments?post=1696"}],"version-history":[{"count":1,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/1696\/revisions"}],"predecessor-version":[{"id":5587,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/1696\/revisions\/5587"}],"wp:attachment":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/media?parent=1696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/categories?post=1696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/tags?post=1696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}