{"id":8725,"date":"2017-06-16T17:46:03","date_gmt":"2017-06-16T09:46:03","guid":{"rendered":"https:\/\/ihower.tw\/blog\/?p=8725"},"modified":"2017-06-17T17:10:35","modified_gmt":"2017-06-17T09:10:35","slug":"%e5%a6%82%e4%bd%95%e7%9c%9f%e6%ad%a3%e8%ae%93-ruby-constants-%e5%b8%b8%e6%95%b8%e7%84%a1%e6%b3%95%e8%a2%ab%e4%bf%ae%e6%94%b9","status":"publish","type":"post","link":"https:\/\/ihower.tw\/blog\/8725-%e5%a6%82%e4%bd%95%e7%9c%9f%e6%ad%a3%e8%ae%93-ruby-constants-%e5%b8%b8%e6%95%b8%e7%84%a1%e6%b3%95%e8%a2%ab%e4%bf%ae%e6%94%b9","title":{"rendered":"\u5982\u4f55\u771f\u6b63\u8b93 Ruby Constants \u5e38\u6578\u7121\u6cd5\u88ab\u4fee\u6539"},"content":{"rendered":"<p>\u5927\u6982\u7ffb\u4e86\u4e00\u4e0b Effective Ruby (<a href=\"https:\/\/www.tenlong.com.tw\/products\/9789863477297\">\u4e2d\u6587<\/a>\u3001<a href=\"https:\/\/www.tenlong.com.tw\/products\/9780133846973\">\u539f\u6587<\/a>)\uff0c\u89ba\u5f97\u5176\u4e2d\u7b2c\u56db\u500b Be Aware That Constants Are Mutable \u6709\u9ede\u610f\u601d\uff0c\u8a18\u9304\u4e0b\u4f86\u3002<\/p>\n<p>\u5728 Ruby \u88e1\u9762\u5927\u5beb\u958b\u982d\u7684\u53eb\u505a\u5e38\u6578\uff0cRuby \u958b\u767c\u8005\u53ef\u80fd\u77e5\u9053\u9019\u500b\u5e38\u6578\u662f\u53ef\u4ee5\u88ab\u4e8b\u5f8c\u4fee\u6539\u7684\uff0c\u96d6\u7136\u6703\u6709\u8b66\u544a\u5566\uff0c\u4f46\u662f\u9084\u662f\u88ab\u4fee\u6539\u5230\u4e86\uff0c\u90a3\u6709\u6c92\u6709\u8fa6\u6cd5\u53ef\u4ee5\u771f\u6b63\u7121\u6cd5\u88ab\u4fee\u6539\u5462? \u539f\u4f86\u8981\u7528 <code>freeze<\/code>\uff0c\u800c\u4e14\u9084\u9700\u8981\u9ede\u6280\u5de7\u3002<\/p>\n<p>\u8b93\u6211\u5011\u770b\u4e00\u4e0b\u4ee3\u78bc\uff1a<\/p>\n<p><!--more--><\/p>\n<div>\n<pre><code class=\"language-none\">X = 1\n\nX = 2\n(irb):17: warning: already initialized constant X \u53ea\u662f\u8b66\u544a\u800c\u5df2\n\n# X \u8b8a\u6210 2 \u4e86 :(<\/code><\/pre>\n<\/div>\n<p>\u76f4\u63a5 <code>X.freeze<\/code>  \u662f\u6c92\u6709\u7528\u7684&#8230;<\/p>\n<div>\n<pre><code class=\"language-none\">X.freeze\nX = 3\n(irb):20: warning: already initialized constant X\n\n# X \u9084\u662f\u8b8a\u6210 3 \u4e86 :(<\/code><\/pre>\n<\/div>\n<p>\u89e3\u6cd5\uff1a\u8981\u7528\u4e00\u500b module \u5305\u8d77\u4f86\uff0c\u7136\u5f8c freeze \u9019\u500b module<\/p>\n<div>\n<pre><code class=\"language-none\">module Y\n  X = 1\nend\n\nY.freeze\n\nY::X = 2\n\n# RuntimeError: can&#39;t modify frozen Module \u4e1f\u51fa\u932f\u8aa4\u4f8b\u5916\uff0c\u4e0d\u80fd\u4fee\u6539! <\/code><\/pre>\n<\/div>\n<p>\u63a5\u4e0b\u4f86\u770b\u770b\u4f7f\u7528\u5bb9\u5668\u7684\u60c5\u6cc1\uff1a<\/p>\n<div>\n<pre><code class=\"language-none\">class A\n  B = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;].freeze\n  \n  def self.mutate\n    B[0] &lt;&lt; &quot;x&quot;\n  end\n    \nend\n\nA::B &lt;&lt; &quot;d&quot;\n# RuntimeError: can&#39;t modify frozen Array \u4e1f\u51fa\u932f\u8aa4\u4f8b\u5916\uff0c\u4e0d\u80fd\u4fee\u6539!\n\nA.mutate\nA::B # \u88ab\u4fee\u6539\u6210 [&quot;ax&quot;, &quot;b&quot;, &quot;c&quot;] \u4e86\uff0c\u5931\u6557 :(\n<\/code><\/pre>\n<\/div>\n<p>Ruby \u958b\u767c\u8005\u5927\u6982\u5df2\u7d93\u77e5\u9053\u53ea freeze \u4e00\u500b\u5bb9\u5668\uff0c\u53ea\u80fd\u9632\u6b62\u65b0\u589e\u548c\u522a\u9664\u5143\u7d20\uff0c\u4e0d\u80fd\u963b\u6b62\u500b\u5225\u7684\u5143\u7d20\u88ab\u76f4\u63a5\u4fee\u6539\u3002\u6240\u4ee5\u89e3\u6cd5\u662f\u6bcf\u500b\u5143\u7d20\u90fd\u8981\u518d freeze \u4e00\u6b21\uff1a<\/p>\n<div>\n<pre><code class=\"language-none\">class A\n  B = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;].map!(&amp;:freeze).freeze\n  \n  def self.mutate\n    B[0] &lt;&lt; &quot;x&quot;\n  end\n    \nend\n\nA::B &lt;&lt; &quot;d&quot;\n# RuntimeError: can&#39;t modify frozen Array \u4e1f\u51fa\u932f\u8aa4\u4f8b\u5916\uff0c\u4e0d\u80fd\u4fee\u6539!\n\nA.mutate\n# RuntimeError: can&#39;t modify frozen String \u4e1f\u51fa\u932f\u8aa4\u4f8b\u5916\uff0c\u4e0d\u80fd\u4fee\u6539!\n<\/code><\/pre>\n<\/div>\n<p>\u9019\u6a23\u5c31\u641e\u5b9a\u5566\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5927\u6982\u7ffb\u4e86\u4e00\u4e0b Effective Ruby (\u4e2d\u6587\u3001\u539f\u6587)\uff0c\u89ba\u5f97\u5176\u4e2d\u7b2c\u56db\u500b Be Aware That Con &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/ihower.tw\/blog\/8725-%e5%a6%82%e4%bd%95%e7%9c%9f%e6%ad%a3%e8%ae%93-ruby-constants-%e5%b8%b8%e6%95%b8%e7%84%a1%e6%b3%95%e8%a2%ab%e4%bf%ae%e6%94%b9\" class=\"more-link\">\u95b1\u8b80\u5168\u6587<span class=\"screen-reader-text\">\u3008\u5982\u4f55\u771f\u6b63\u8b93 Ruby Constants \u5e38\u6578\u7121\u6cd5\u88ab\u4fee\u6539\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":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[31],"tags":[],"class_list":["post-8725","post","type-post","status-publish","format-standard","hentry","category-ruby","entry"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p1q6tG-2gJ","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/8725","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=8725"}],"version-history":[{"count":11,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/8725\/revisions"}],"predecessor-version":[{"id":8739,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/posts\/8725\/revisions\/8739"}],"wp:attachment":[{"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/media?parent=8725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/categories?post=8725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ihower.tw\/blog\/wp-json\/wp\/v2\/tags?post=8725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}