ruby_learner 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +58 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +65 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/new_terminal +25 -0
  13. data/bin/setup +8 -0
  14. data/docs/happy_ruby/RussOlsen_EloquentRuby_c1.pdf +0 -0
  15. data/docs/happy_ruby/RussOlsen_EloquentRuby_c5.pdf +0 -0
  16. data/docs/happy_ruby/TanoshiiRuby_v3_c23.pdf +0 -0
  17. data/docs/happy_ruby/TanoshiiRuby_v5_c1.pdf +0 -0
  18. data/docs/happy_ruby/TanoshiiRuby_v5_c2-3.pdf +0 -0
  19. data/docs/happy_ruby/c2.ipynb +479 -0
  20. data/docs/happy_ruby/c3_4.ipynb +237 -0
  21. data/docs/seminar/8-1.org +18 -0
  22. data/exe/ruby_learner +5 -0
  23. data/lib/ruby_learner/h.rb +14 -0
  24. data/lib/ruby_learner/methods.rb +131 -0
  25. data/lib/ruby_learner/random_h.rb +16 -0
  26. data/lib/ruby_learner/ruby_learner.rb +43 -0
  27. data/lib/ruby_learner/sequential_h.rb +15 -0
  28. data/lib/ruby_learner/typing_practice.rb +21 -0
  29. data/lib/ruby_learner/version.rb +3 -0
  30. data/questions/random_check/.rspec +1 -0
  31. data/questions/random_check/random_h.rb +16 -0
  32. data/questions/random_check/section_1/.rspec +1 -0
  33. data/questions/random_check/section_1/lib/answer.rb +15 -0
  34. data/questions/random_check/section_1/lib/sentence.org +9 -0
  35. data/questions/random_check/section_1/lib/workplace.rb +5 -0
  36. data/questions/random_check/section_1/spec/spec_helper.rb +100 -0
  37. data/questions/random_check/section_1/spec/workplace_spec.rb +10 -0
  38. data/questions/random_check/section_2/.rspec +1 -0
  39. data/questions/random_check/section_2/lib/answer.rb +17 -0
  40. data/questions/random_check/section_2/lib/sentence.org +12 -0
  41. data/questions/random_check/section_2/lib/workplace.rb +5 -0
  42. data/questions/random_check/section_2/spec/.rspec +1 -0
  43. data/questions/random_check/section_2/spec/spec_helper.rb +100 -0
  44. data/questions/random_check/section_2/spec/workplace_spec.rb +11 -0
  45. data/questions/sequential_check/section_1/part_1/lib/answer.rb +9 -0
  46. data/questions/sequential_check/section_1/part_1/lib/sentence.org +9 -0
  47. data/questions/sequential_check/section_1/part_1/lib/workplace.rb +5 -0
  48. data/questions/sequential_check/section_1/part_1/spec/spec_helper.rb +100 -0
  49. data/questions/sequential_check/section_1/part_1/spec/workplace_spec.rb +10 -0
  50. data/questions/sequential_check/section_1/part_2/lib/answer.rb +16 -0
  51. data/questions/sequential_check/section_1/part_2/lib/sentence.org +12 -0
  52. data/questions/sequential_check/section_1/part_2/lib/workplace.rb +5 -0
  53. data/questions/sequential_check/section_1/part_2/spec/.rspec +1 -0
  54. data/questions/sequential_check/section_1/part_2/spec/spec_helper.rb +100 -0
  55. data/questions/sequential_check/section_1/part_2/spec/workplace_spec.rb +11 -0
  56. data/ruby_learner.gemspec +41 -0
  57. data/takahashi/docs/README.org +139 -0
  58. data/takahashi/docs/drill.html +875 -0
  59. data/takahashi/docs/drill.html~ +877 -0
  60. data/takahashi/docs/drill.org +446 -0
  61. data/takahashi/docs/ruby_for_beginner.html +2642 -0
  62. data/takahashi/docs/ruby_for_beginner.org +1430 -0
  63. data/takahashi/sample_prog/answer/10_1.rb +5 -0
  64. data/takahashi/sample_prog/answer/11_1.rb +5 -0
  65. data/takahashi/sample_prog/answer/11_2.rb +4 -0
  66. data/takahashi/sample_prog/answer/1_1.rb +1 -0
  67. data/takahashi/sample_prog/answer/1_2.rb +1 -0
  68. data/takahashi/sample_prog/answer/1_3.rb +1 -0
  69. data/takahashi/sample_prog/answer/2_1.rb +5 -0
  70. data/takahashi/sample_prog/answer/2_2.rb +12 -0
  71. data/takahashi/sample_prog/answer/3_1.rb +10 -0
  72. data/takahashi/sample_prog/answer/4_1.rb +7 -0
  73. data/takahashi/sample_prog/answer/5_1.rb +6 -0
  74. data/takahashi/sample_prog/answer/5_2.rb +3 -0
  75. data/takahashi/sample_prog/answer/6_1.rb +3 -0
  76. data/takahashi/sample_prog/answer/6_2.rb +5 -0
  77. data/takahashi/sample_prog/answer/6_3.rb +5 -0
  78. data/takahashi/sample_prog/answer/6_4.rb +7 -0
  79. data/takahashi/sample_prog/answer/7_1.rb +3 -0
  80. data/takahashi/sample_prog/answer/7_2.rb +8 -0
  81. data/takahashi/sample_prog/answer/9_1.rb +3 -0
  82. data/takahashi/sample_prog/answer/9_2.rb +5 -0
  83. data/takahashi/sample_prog/answer/9_3.rb +10 -0
  84. data/takahashi/sample_prog/answer/hello.rb +3 -0
  85. data/workshop/.rspec +1 -0
  86. data/workshop/emacs.d/ac-comphist.dat +50 -0
  87. data/workshop/emacs.d/cp5022x.el +156 -0
  88. data/workshop/emacs.d/elpa/archives/gnu/archive-contents +1240 -0
  89. data/workshop/emacs.d/elpa/archives/melpa/archive-contents +2 -0
  90. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-autoloads.el +65 -0
  91. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-config.el +551 -0
  92. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-config.elc +0 -0
  93. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete-pkg.el +6 -0
  94. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete.el +2164 -0
  95. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/auto-complete.elc +0 -0
  96. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ada-mode +72 -0
  97. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/c++-mode +99 -0
  98. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/c-mode +55 -0
  99. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/caml-mode +231 -0
  100. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/clojure-mode +580 -0
  101. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/clojurescript-mode +475 -0
  102. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/coq-mode +278 -0
  103. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/css-mode +874 -0
  104. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/erlang-mode +216 -0
  105. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ess-julia-mode +37 -0
  106. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/go-mode +25 -0
  107. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/haskell-mode +679 -0
  108. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/java-mode +53 -0
  109. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/js-mode +148 -0
  110. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/julia-mode +37 -0
  111. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/lua-mode +21 -0
  112. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/nim-mode +70 -0
  113. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/objc-mode +161 -0
  114. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/octave-mode +46 -0
  115. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/php-mode +6144 -0
  116. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/python-mode +379 -0
  117. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/qml-mode +183 -0
  118. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ruby-mode +181 -0
  119. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/scala-mode +1347 -0
  120. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/scheme-mode +216 -0
  121. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/sclang-mode +1481 -0
  122. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/sh-mode +182 -0
  123. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/swift-mode +87 -0
  124. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/tcl-mode +172 -0
  125. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/ts-mode +797 -0
  126. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/tuareg-mode +231 -0
  127. data/workshop/emacs.d/elpa/auto-complete-20170124.1845/dict/verilog-mode +313 -0
  128. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults-autoloads.el +16 -0
  129. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults-pkg.el +2 -0
  130. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults.el +90 -0
  131. data/workshop/emacs.d/elpa/better-defaults-20170613.2104/better-defaults.elc +0 -0
  132. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode-autoloads.el +26 -0
  133. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode-pkg.el +2 -0
  134. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode.el +877 -0
  135. data/workshop/emacs.d/elpa/haml-mode-20170923.2153/haml-mode.elc +0 -0
  136. data/workshop/emacs.d/elpa/haml-mode-readme.txt +8 -0
  137. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-light-theme.el +918 -0
  138. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-light-theme.elc +0 -0
  139. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme-autoloads.el +32 -0
  140. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme-pkg.el +8 -0
  141. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme.el +912 -0
  142. data/workshop/emacs.d/elpa/material-theme-20171123.1040/material-theme.elc +0 -0
  143. data/workshop/emacs.d/elpa/ox-bibtex-chinese-readme.txt +21 -0
  144. data/workshop/emacs.d/elpa/popup-20160709.729/popup-autoloads.el +15 -0
  145. data/workshop/emacs.d/elpa/popup-20160709.729/popup-pkg.el +2 -0
  146. data/workshop/emacs.d/elpa/popup-20160709.729/popup.el +1432 -0
  147. data/workshop/emacs.d/elpa/popup-20160709.729/popup.elc +0 -0
  148. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode-autoloads.el +33 -0
  149. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode-pkg.el +2 -0
  150. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode.el +470 -0
  151. data/workshop/emacs.d/elpa/yaml-mode-20180212.1556/yaml-mode.elc +0 -0
  152. data/workshop/emacs.d/elpa/yaml-mode-readme.txt +25 -0
  153. data/workshop/emacs.d/haml-mode-master/.gitignore +1 -0
  154. data/workshop/emacs.d/haml-mode-master/.mailmap +2 -0
  155. data/workshop/emacs.d/haml-mode-master/MIT-LICENSE +20 -0
  156. data/workshop/emacs.d/haml-mode-master/README.md +47 -0
  157. data/workshop/emacs.d/haml-mode-master/haml-mode.el +887 -0
  158. data/workshop/emacs.d/iceberg_theme.el +202 -0
  159. data/workshop/emacs.d/init-open-recentf.el +133 -0
  160. data/workshop/emacs.d/init.el +229 -0
  161. data/workshop/emacs.d/inits/line-num.el +264 -0
  162. data/workshop/emacs.d/install-elisp.el +366 -0
  163. data/workshop/emacs.d/markdown-mode/markdown-mode.el +5978 -0
  164. data/workshop/emacs.d/notes +12 -0
  165. data/workshop/emacs.d/processing-mode/processing-mode.el +275 -0
  166. data/workshop/emacs.d/recentf +31 -0
  167. data/workshop/emacs.d/ruby-mode/inf-ruby.el +416 -0
  168. data/workshop/emacs.d/ruby-mode/rdoc-mode.el +130 -0
  169. data/workshop/emacs.d/ruby-mode/ruby-electric.el +205 -0
  170. data/workshop/emacs.d/ruby-mode/ruby-mode.el +1496 -0
  171. data/workshop/emacs.d/ruby-mode/ruby-style.el +78 -0
  172. data/workshop/emacs.d/ruby-mode/rubydb2x.el +104 -0
  173. data/workshop/emacs.d/ruby-mode/rubydb3x.el +115 -0
  174. data/workshop/emacs.d/ruby_learner_init.el +244 -0
  175. data/workshop/emacs.d/themes/dracula-theme.el +431 -0
  176. data/workshop/emacs.d/themes/iceberg-theme.el +205 -0
  177. data/workshop/emacs.d/themes/my-misterioso-theme.el +109 -0
  178. data/workshop/emacs.d/themes/my-wombat-theme.el +121 -0
  179. data/workshop/emacs.d/wiki-mode/wiki.el +976 -0
  180. data/workshop/emacs_help.org +34 -0
  181. data/workshop/lib/answer.rb +1 -0
  182. data/workshop/lib/sentence.org +1 -0
  183. data/workshop/lib/workplace.rb +1 -0
  184. data/workshop/restore/empty.rb +0 -0
  185. data/workshop/spec/spec_helper.rb +100 -0
  186. data/workshop/spec/workplace_spec.rb +1 -0
  187. data/workshop/training_data.txt +3 -0
  188. metadata +343 -0
@@ -0,0 +1,2642 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="jp" xml:lang="jp">
5
+ <head>
6
+ <title>はじめてのRuby</title>
7
+ <!-- 2018-08-02 木 14:55 -->
8
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
9
+ <meta name="generator" content="Org-mode" />
10
+ <meta name="author" content="Shun Takahashi" />
11
+ <style type="text/css">
12
+ <!--/*--><![CDATA[/*><!--*/
13
+ .title { text-align: center; }
14
+ .todo { font-family: monospace; color: red; }
15
+ .done { color: green; }
16
+ .tag { background-color: #eee; font-family: monospace;
17
+ padding: 2px; font-size: 80%; font-weight: normal; }
18
+ .timestamp { color: #bebebe; }
19
+ .timestamp-kwd { color: #5f9ea0; }
20
+ .right { margin-left: auto; margin-right: 0px; text-align: right; }
21
+ .left { margin-left: 0px; margin-right: auto; text-align: left; }
22
+ .center { margin-left: auto; margin-right: auto; text-align: center; }
23
+ .underline { text-decoration: underline; }
24
+ #postamble p, #preamble p { font-size: 90%; margin: .2em; }
25
+ p.verse { margin-left: 3%; }
26
+ pre {
27
+ border: 1px solid #ccc;
28
+ box-shadow: 3px 3px 3px #eee;
29
+ padding: 8pt;
30
+ font-family: monospace;
31
+ overflow: auto;
32
+ margin: 1.2em;
33
+ }
34
+ pre.src {
35
+ position: relative;
36
+ overflow: visible;
37
+ padding-top: 1.2em;
38
+ }
39
+ pre.src:before {
40
+ display: none;
41
+ position: absolute;
42
+ background-color: white;
43
+ top: -10px;
44
+ right: 10px;
45
+ padding: 3px;
46
+ border: 1px solid black;
47
+ }
48
+ pre.src:hover:before { display: inline;}
49
+ pre.src-sh:before { content: 'sh'; }
50
+ pre.src-bash:before { content: 'sh'; }
51
+ pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
52
+ pre.src-R:before { content: 'R'; }
53
+ pre.src-perl:before { content: 'Perl'; }
54
+ pre.src-java:before { content: 'Java'; }
55
+ pre.src-sql:before { content: 'SQL'; }
56
+
57
+ table { border-collapse:collapse; }
58
+ caption.t-above { caption-side: top; }
59
+ caption.t-bottom { caption-side: bottom; }
60
+ td, th { vertical-align:top; }
61
+ th.right { text-align: center; }
62
+ th.left { text-align: center; }
63
+ th.center { text-align: center; }
64
+ td.right { text-align: right; }
65
+ td.left { text-align: left; }
66
+ td.center { text-align: center; }
67
+ dt { font-weight: bold; }
68
+ .footpara:nth-child(2) { display: inline; }
69
+ .footpara { display: block; }
70
+ .footdef { margin-bottom: 1em; }
71
+ .figure { padding: 1em; }
72
+ .figure p { text-align: center; }
73
+ .inlinetask {
74
+ padding: 10px;
75
+ border: 2px solid gray;
76
+ margin: 10px;
77
+ background: #ffffcc;
78
+ }
79
+ #org-div-home-and-up
80
+ { text-align: right; font-size: 70%; white-space: nowrap; }
81
+ textarea { overflow-x: auto; }
82
+ .linenr { font-size: smaller }
83
+ .code-highlighted { background-color: #ffff00; }
84
+ .org-info-js_info-navigation { border-style: none; }
85
+ #org-info-js_console-label
86
+ { font-size: 10px; font-weight: bold; white-space: nowrap; }
87
+ .org-info-js_search-highlight
88
+ { background-color: #ffff00; color: #000000; font-weight: bold; }
89
+ /*]]>*/-->
90
+ </style>
91
+ <link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/htmlize.css"/>
92
+ <link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css"/>
93
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
94
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
95
+ <script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
96
+ <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
97
+ <script type="text/javascript">
98
+ /*
99
+ @licstart The following is the entire license notice for the
100
+ JavaScript code in this tag.
101
+
102
+ Copyright (C) 2012-2013 Free Software Foundation, Inc.
103
+
104
+ The JavaScript code in this tag is free software: you can
105
+ redistribute it and/or modify it under the terms of the GNU
106
+ General Public License (GNU GPL) as published by the Free Software
107
+ Foundation, either version 3 of the License, or (at your option)
108
+ any later version. The code is distributed WITHOUT ANY WARRANTY;
109
+ without even the implied warranty of MERCHANTABILITY or FITNESS
110
+ FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
111
+
112
+ As additional permission under GNU GPL version 3 section 7, you
113
+ may distribute non-source (e.g., minimized or compacted) forms of
114
+ that code without the copy of the GNU GPL normally required by
115
+ section 4, provided you include this license notice and a URL
116
+ through which recipients can access the Corresponding Source.
117
+
118
+
119
+ @licend The above is the entire license notice
120
+ for the JavaScript code in this tag.
121
+ */
122
+ <!--/*--><![CDATA[/*><!--*/
123
+ function CodeHighlightOn(elem, id)
124
+ {
125
+ var target = document.getElementById(id);
126
+ if(null != target) {
127
+ elem.cacheClassElem = elem.className;
128
+ elem.cacheClassTarget = target.className;
129
+ target.className = "code-highlighted";
130
+ elem.className = "code-highlighted";
131
+ }
132
+ }
133
+ function CodeHighlightOff(elem, id)
134
+ {
135
+ var target = document.getElementById(id);
136
+ if(elem.cacheClassElem)
137
+ elem.className = elem.cacheClassElem;
138
+ if(elem.cacheClassTarget)
139
+ target.className = elem.cacheClassTarget;
140
+ }
141
+ /*]]>*///-->
142
+ </script>
143
+ <script type="text/javascript" src="http://orgmode.org/mathjax/MathJax.js"></script>
144
+ <script type="text/javascript">
145
+ <!--/*--><![CDATA[/*><!--*/
146
+ MathJax.Hub.Config({
147
+ // Only one of the two following lines, depending on user settings
148
+ // First allows browser-native MathML display, second forces HTML/CSS
149
+ // config: ["MMLorHTML.js"], jax: ["input/TeX"],
150
+ jax: ["input/TeX", "output/HTML-CSS"],
151
+ extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js",
152
+ "TeX/noUndefined.js"],
153
+ tex2jax: {
154
+ inlineMath: [ ["\\(","\\)"] ],
155
+ displayMath: [ ['$$','$$'], ["\\[","\\]"], ["\\begin{displaymath}","\\end{displaymath}"] ],
156
+ skipTags: ["script","noscript","style","textarea","pre","code"],
157
+ ignoreClass: "tex2jax_ignore",
158
+ processEscapes: false,
159
+ processEnvironments: true,
160
+ preview: "TeX"
161
+ },
162
+ showProcessingMessages: true,
163
+ displayAlign: "center",
164
+ displayIndent: "2em",
165
+
166
+ "HTML-CSS": {
167
+ scale: 100,
168
+ availableFonts: ["STIX","TeX"],
169
+ preferredFont: "TeX",
170
+ webFont: "TeX",
171
+ imageFont: "TeX",
172
+ showMathMenu: true,
173
+ },
174
+ MMLorHTML: {
175
+ prefer: {
176
+ MSIE: "MML",
177
+ Firefox: "MML",
178
+ Opera: "HTML",
179
+ other: "HTML"
180
+ }
181
+ }
182
+ });
183
+ /*]]>*///-->
184
+ </script>
185
+ </head>
186
+ <body>
187
+ <div id="content">
188
+ <h1 class="title">はじめてのRuby</h1>
189
+ <div id="table-of-contents">
190
+ <h2>Table of Contents</h2>
191
+ <div id="text-table-of-contents">
192
+ <ul>
193
+ <li><a href="#sec-1">1. はじめてのRuby</a>
194
+ <ul>
195
+ <li><a href="#sec-1-1">1.1. イントロダクション</a></li>
196
+ <li><a href="#sec-1-2">1.2. Rubyの実行方法</a>
197
+ <ul>
198
+ <li><a href="#sec-1-2-1">イントロダクション</a></li>
199
+ <li><a href="#sec-1-2-2">rubyコマンドを使う方法</a></li>
200
+ <li><a href="#sec-1-2-3">1.1.2. irbコマンドを使う方法</a></li>
201
+ </ul>
202
+ </li>
203
+ <li><a href="#sec-1-3">1.3. プログラムの解説</a>
204
+ <ul>
205
+ <li><a href="#sec-1-3-1">イントロダクション</a></li>
206
+ <li><a href="#sec-1-3-2">1.2.1. オブジェクト</a></li>
207
+ <li><a href="#sec-1-3-3">1.2.2. メソッド</a></li>
208
+ </ul>
209
+ </li>
210
+ <li><a href="#sec-1-4">1.4. 文字列</a>
211
+ <ul>
212
+ <li><a href="#sec-1-4-1">イントロダクション</a></li>
213
+ <li><a href="#sec-1-4-2">1.3.1. 改行文字と「\」</a></li>
214
+ <li><a href="#sec-1-4-3">1.3.2. 「''」と「""」</a></li>
215
+ </ul>
216
+ </li>
217
+ <li><a href="#sec-1-5">1.5. メソッドの呼び出し</a></li>
218
+ <li><a href="#sec-1-6">1.6. putsメソッド</a></li>
219
+ <li><a href="#sec-1-7">1.7. pメソッド</a></li>
220
+ <li><a href="#sec-1-8">1.8. 日本語の表示</a>
221
+ <ul>
222
+ <li><a href="#sec-1-8-1">コラム「日本語を扱う場合の注意」</a></li>
223
+ </ul>
224
+ </li>
225
+ <li><a href="#sec-1-9">1.9. 数値の表示と計算</a>
226
+ <ul>
227
+ <li><a href="#sec-1-9-1">イントロダクション</a></li>
228
+ <li><a href="#sec-1-9-2">1.8.1. 数値の表示</a></li>
229
+ <li><a href="#sec-1-9-3">1.8.2. 四則演算</a></li>
230
+ <li><a href="#sec-1-9-4">1.8.3. 数学的な関数</a></li>
231
+ </ul>
232
+ </li>
233
+ <li><a href="#sec-1-10">1.10. 変数</a>
234
+ <ul>
235
+ <li><a href="#sec-1-10-1">1.9.1. printメソッドと変数</a></li>
236
+ </ul>
237
+ </li>
238
+ <li><a href="#sec-1-11">1.11. コメントを書く</a></li>
239
+ <li><a href="#sec-1-12">1.12. 制御構造</a>
240
+ <ul>
241
+ <li><a href="#sec-1-12-1">イントロダクション</a></li>
242
+ <li><a href="#sec-1-12-2">1.11.1. 制御構造の分類</a></li>
243
+ </ul>
244
+ </li>
245
+ <li><a href="#sec-1-13">1.13. 条件判断:if ~ then ~ end</a></li>
246
+ <li><a href="#sec-1-14">1.14. 繰り返し</a>
247
+ <ul>
248
+ <li><a href="#sec-1-14-1">イントロダクション</a></li>
249
+ <li><a href="#sec-1-14-2">while文</a></li>
250
+ <li><a href="#sec-1-14-3">timesメソッド</a></li>
251
+ </ul>
252
+ </li>
253
+ </ul>
254
+ </li>
255
+ <li><a href="#sec-2">2. 便利なオブジェクト</a>
256
+ <ul>
257
+ <li><a href="#sec-2-1">2.1. イントロダクション</a></li>
258
+ <li><a href="#sec-2-2">2.2. 配列(array)</a>
259
+ <ul>
260
+ <li><a href="#sec-2-2-1">イントロダクション</a></li>
261
+ <li><a href="#sec-2-2-2">2.1.1. 配列を作る</a></li>
262
+ <li><a href="#sec-2-2-3">2.1.2. 配列オブジェクト</a></li>
263
+ <li><a href="#sec-2-2-4">2.1.3. 配列からオブジェクトを取り出す</a></li>
264
+ <li><a href="#sec-2-2-5">2.1.4. 配列にオブジェクトを格納する</a></li>
265
+ <li><a href="#sec-2-2-6">2.1.5. 配列の中身</a></li>
266
+ <li><a href="#sec-2-2-7">2.1.6. 配列と大きさ</a></li>
267
+ <li><a href="#sec-2-2-8">2.1.7. 配列と繰り返し</a></li>
268
+ </ul>
269
+ </li>
270
+ <li><a href="#sec-2-3">2.3. ハッシュ(Hash)</a>
271
+ <ul>
272
+ <li><a href="#sec-2-3-1">2.2.1. シンボルとは</a></li>
273
+ <li><a href="#sec-2-3-2">2.2.2. ハッシュを作る</a></li>
274
+ <li><a href="#sec-2-3-3">2.2.3. ハッシュの操作</a></li>
275
+ <li><a href="#sec-2-3-4">2.2.4. ハッシュの繰り返し</a></li>
276
+ </ul>
277
+ </li>
278
+ <li><a href="#sec-2-4">2.4. 正規表現</a>
279
+ <ul>
280
+ <li><a href="#sec-2-4-1">2.3.1. パターンとマッチング</a></li>
281
+ <li><a href="#sec-2-4-2">コラム「nilとは?」</a></li>
282
+ </ul>
283
+ </li>
284
+ </ul>
285
+ </li>
286
+ <li><a href="#sec-3">3. コマンドを作ろう</a>
287
+ <ul>
288
+ <li><a href="#sec-3-1">3.1. イントロダクション</a></li>
289
+ <li><a href="#sec-3-2">3.2. コマンドラインからのデータの入力</a></li>
290
+ <li><a href="#sec-3-3">3.3. ファイルからの読み込み</a>
291
+ <ul>
292
+ <li><a href="#sec-3-3-1">イントロダクション</a></li>
293
+ <li><a href="#sec-3-3-2">3.2.1. ファイルからテキストデータを読み込んで表示する</a></li>
294
+ <li><a href="#sec-3-3-3">3.2.2. ファイルからテキストデータを1行ずつ読み込んで表示する</a></li>
295
+ <li><a href="#sec-3-3-4">3.2.3. ファイルの中から特定のパターンの行のみを選んで出力する</a></li>
296
+ </ul>
297
+ </li>
298
+ <li><a href="#sec-3-4">3.4. メソッドの作成</a></li>
299
+ <li><a href="#sec-3-5">3.5. 別のファイルを取り込む</a>
300
+ <ul>
301
+ <li><a href="#sec-3-5-1">コラム「ppメソッド」</a></li>
302
+ </ul>
303
+ </li>
304
+ </ul>
305
+ </li>
306
+ </ul>
307
+ </div>
308
+ </div>
309
+ <ul class="org-ul">
310
+ <li>各実行方法(irb, file起動)の違いについて言及している,レジメ(report)にする.自分の独自のまとめをかく....
311
+ </li>
312
+ <li>formatを調整する.c-c c-e hoでhtmlに打ち出す.
313
+ </li>
314
+ </ul>
315
+
316
+ <div id="outline-container-sec-1" class="outline-2">
317
+ <h2 id="sec-1"><span class="section-number-2">1</span> はじめてのRuby</h2>
318
+ <div class="outline-text-2" id="text-1">
319
+ </div><div id="outline-container-sec-1-1" class="outline-3">
320
+ <h3 id="sec-1-1"><span class="section-number-3">1.1</span> イントロダクション</h3>
321
+ <div class="outline-text-3" id="text-1-1">
322
+ <p>
323
+  それではRubyを使ってみましょう。
324
+  この章では次の内容について紹介します。Rubyを使ったプログラミングの概要をつかんでください。
325
+ </p>
326
+
327
+ <ul class="org-ul">
328
+ <li>Rubyを使う- Rubyを使って、プログラムを実行してみます。
329
+ </li>
330
+ <li>文字や数値を使う- 文字や数値を出力したり、計算を行ったり、変数に代入したりします。
331
+ </li>
332
+ <li>条件判断や繰り返しを行う- 数値や文字列を比較して条件判断や、処理の繰り返しを行います。
333
+ </li>
334
+ </ul>
335
+ </div>
336
+ </div>
337
+
338
+ <div id="outline-container-sec-1-2" class="outline-3">
339
+ <h3 id="sec-1-2"><span class="section-number-3">1.2</span> Rubyの実行方法</h3>
340
+ <div class="outline-text-3" id="text-1-2">
341
+ </div><div id="outline-container-sec-1-2-1" class="outline-4">
342
+ <h4 id="sec-1-2-1">イントロダクション</h4>
343
+ <div class="outline-text-4" id="text-1-2-1">
344
+ <p>
345
+  まずは、画面に文字を表示するプログラムを作り、実行してみましょう。
346
+ </p>
347
+
348
+ <p>
349
+  Rubyで書かれたプログラムを実行する方法はいくつかあります。いちばん一般的なのは、rubyというコマンドを使って実行する方法です。次によく使うのが、irbというコマンドを使って対話的に実行する方法です。小さいRubyプログラムの時は、irbコマンドを使う方が簡単に実行できます。
350
+ </p>
351
+
352
+ <p>
353
+ ここではまずrubyコマンドを使う方法を紹介して、その後でirbコマンドを使う方法も紹介します。
354
+ </p>
355
+
356
+
357
+
358
+ <p>
359
+  なお、Rubyそのものをインストールしていない人は、「付録A Ruby実行環境の準備」を見て、あらかじめインストールしておいてください。
360
+ </p>
361
+
362
+ <ul class="org-ul">
363
+ <li>付録Aについては割愛
364
+ </li>
365
+
366
+ <li>注 本書で使用するRubyのバージョンは、Ruby2.3です。Mac OS XやLinuxを使用している場合、標準でインストールされているRubyのバージョンが古いことがあります。その場合、新しいRubyをインストールしてください。
367
+ </li>
368
+ </ul>
369
+ </div>
370
+ </div>
371
+
372
+ <div id="outline-container-sec-1-2-2" class="outline-4">
373
+ <h4 id="sec-1-2-2">rubyコマンドを使う方法</h4>
374
+ <div class="outline-text-4" id="text-1-2-2">
375
+ <p>
376
+  では、はじめて実行するプログラムList1.1を見てみましょう。
377
+ </p>
378
+
379
+ <p>
380
+ List1.1 helloruby.rb
381
+ </p>
382
+ <div class="org-src-container">
383
+
384
+ <pre class="src src-ruby">print('Hello, Ruby.\n')
385
+ </pre>
386
+ </div>
387
+
388
+ <p>
389
+ *注 「\」(バックスラッシュ)は、Windowsでは「¥」(円記号)と表示されます。本書の中では、原則として「\」に統一します。
390
+ </p>
391
+
392
+ <p>
393
+ ……ちょっと拍子抜けしたでしょうか?「プログラム」と聞いて、何かすごく長い暗号めいたものを想像されたかもしれませんが、このプログラムはたったの1行です。文字数にしても20字ちょっとしかありません。でも、これも立派なプログラムですし、実行すればちゃんと目的を果たします。
394
+  このプログラムをエディタで入力し、ファイル名を「helloruby.rb」にして、ファイルとして保存してください。ファイル名の「.rb」は、Rubyのプログラムであることを表しています。
395
+ </p>
396
+
397
+ <p>
398
+ *メモ プログラムを入力するには、「エディタ」または「IDE」というソフトウェアを使います。エディタやIDEについては、「A.5 エディタとIDE」をご覧ください
399
+ </p>
400
+ <p>
401
+  それでは、このプログラムを実行してみましょう。コンソールを起動します。
402
+ </p>
403
+
404
+ <p>
405
+ *メモ コンソールの起動方法については、「付録A Ruby実行環境の準備」でOS別に説明しています。
406
+ </p>
407
+
408
+ <p>
409
+  コンソールを起動したら、ファイルhelloruby.rbを置いたフォルダに、cdコマンドで移動します。たとえばWindowsを使っていて、Cドライブのsrcフォルダ(c:\src)にファイルを置いたのであれば、次のように入力します。
410
+ </p>
411
+
412
+ <p>
413
+ &gt; cd c:\src
414
+ </p>
415
+
416
+ <p>
417
+  そこで、
418
+ </p>
419
+
420
+ <p>
421
+ &gt; ruby helloruby.rb
422
+ </p>
423
+
424
+ <p>
425
+  と入力します。すると、例1.1のように、「Hello, Ruby.」と表示されます。
426
+ </p>
427
+
428
+ <p>
429
+ 例1.1 rubyの起動
430
+ </p>
431
+
432
+ <p>
433
+ shun@MAC-no-MacBook-Air ~/g/m/t/r/sample_prog&gt; ruby helloruby.rb
434
+ Hello, Ruby.
435
+ shun@MAC-no-MacBook-Air ~/g/m/t/r/sample_prog&gt;
436
+ </p>
437
+
438
+
439
+ <p>
440
+ *メモ もしエラーが出てしまうようなら、第10章のコラム「エラーメッセージ」および「付録A Ruby実行環境の準備」を確認してください。
441
+ </p>
442
+ </div>
443
+ </div>
444
+
445
+ <div id="outline-container-sec-1-2-3" class="outline-4">
446
+ <h4 id="sec-1-2-3">1.1.2. irbコマンドを使う方法</h4>
447
+ <div class="outline-text-4" id="text-1-2-3">
448
+ <p>
449
+  irbコマンドを使う方法も紹介します。
450
+  irbコマンドは、rubyコマンドと同様にコンソールから実行します。ただし、プログラムを書いたファイルは指定しません。
451
+  irbコマンドを実行すると、次のように入力プロンプトが表示されます
452
+ </p>
453
+
454
+ <p>
455
+ shun@MAC-no-MacBook-Air ~/g/m/t/r/sample_prog&gt; irb
456
+ irb(main):001:0&gt;
457
+ </p>
458
+
459
+ <p>
460
+  ここで、先ほどのプログラムList1.1をそのまま入力し、[Enter]キーを押すと、その場で実行されます。
461
+ </p>
462
+
463
+ <p>
464
+ irb(main):001:0&gt; print("Hello, Ruby.\n")
465
+ Hello, Ruby.
466
+ =&gt; nil
467
+ irb(main):002:0&gt;
468
+ </p>
469
+
470
+ <p>
471
+ *メモ 3行目に表示される「=&gt;nil」というのが、print文自体の戻り値です。詳しくは「7.3.1 メソッドの戻り値」で説明します。
472
+ </p>
473
+
474
+ <p>
475
+  このように、入力したプログラムをその場で実行できるので、簡単なテストにはとても便利です。ただし、大きなプログラムを試すのには不向きなので、そのような場合にはrubyコマンドを使いましょう。
476
+  irbコマンドを終了するに「exit」と入力して[Enter]キーを押すか、[Control]([Ctrl])キーを押しながら[d]キーを押します。
477
+ </p>
478
+
479
+ <p>
480
+ *注 Mac OS XやWindowsを使っている場合、irbコマンドでは日本語が正しく入力できないことがあります。その場合、irbコマンドに&#x2013;noreadlineオプションをつけて「irb &#x2013;noreadline」と実行してください。これでreadline機能がオフになり、日本語を正しく入力できるようになります。ただし、readline機能をオフにすると、入力済みの文字の編集機能やヒストリ入力支援機能などが使えなくなってしまうので注意してください。
481
+ </p>
482
+ </div>
483
+ </div>
484
+ </div>
485
+
486
+ <div id="outline-container-sec-1-3" class="outline-3">
487
+ <h3 id="sec-1-3"><span class="section-number-3">1.3</span> プログラムの解説</h3>
488
+ <div class="outline-text-3" id="text-1-3">
489
+ </div><div id="outline-container-sec-1-3-1" class="outline-4">
490
+ <h4 id="sec-1-3-1">イントロダクション</h4>
491
+ <div class="outline-text-4" id="text-1-3-1">
492
+ <p>
493
+  それでは、ほんの1行だけではありますが、List1.1のプログラムを解説しましょう。
494
+ </p>
495
+ </div>
496
+ </div>
497
+
498
+ <div id="outline-container-sec-1-3-2" class="outline-4">
499
+ <h4 id="sec-1-3-2">1.2.1. オブジェクト</h4>
500
+ <div class="outline-text-4" id="text-1-3-2">
501
+ <div class="org-src-container">
502
+
503
+ <pre class="src src-ruby">print("Hello, Ruby.\n")
504
+ </pre>
505
+ </div>
506
+
507
+ <p>
508
+  まず、「"Hello, Ruby.\n"」という部分に注目します。
509
+ </p>
510
+
511
+ <p>
512
+  これをStringオブジェクト、または文字列オブジェクト、あるいは単に文字列と呼びます。「Hello,Ruby.」という文字列を意味するオブジェクト、というわけです。
513
+ </p>
514
+
515
+ <p>
516
+  Rubyでは、文字列、数値、時刻など様々なデータがオブジェクトになります。
517
+ </p>
518
+
519
+ <p>
520
+ *メモ 文字列の終わりの「\n」は改行を表す文字です。
521
+ </p>
522
+ </div>
523
+ </div>
524
+
525
+ <div id="outline-container-sec-1-3-3" class="outline-4">
526
+ <h4 id="sec-1-3-3">1.2.2. メソッド</h4>
527
+ <div class="outline-text-4" id="text-1-3-3">
528
+ <div class="org-src-container">
529
+
530
+ <pre class="src src-ruby">print("Hello, Ruby.\n")
531
+ </pre>
532
+ </div>
533
+
534
+ <p>
535
+  今度はprintという部分に注目しましょう。
536
+ </p>
537
+
538
+ <p>
539
+  「print」は、メソッドです。メソッドとは、オブジェクトを扱うための手続きのことです。「数値」を使って足し算や掛け算をしたり、「文字列」同士をつなげたり、「ある時刻」の1時間後や1日後を求めたりといったことは、すべてメソッドを起動することによって行われます。
540
+  printメソッドは、「()」のなかの内容をコンソールに出力するメソッドです。ですから、helloruby.rbでは、「Hello, Ruby.」という文字列オブジェクトが表示されています。
541
+  メソッドに渡す情報のことを引数といいます。例えば、printメソッドの機能を説明する場合には「printメソッドは引数として与えられた文字列をコンソールに出力します」といった使い方をします。
542
+  printメソッドの引数を書き換えて、別の文字列を表示するプログラムにしてみましょう。
543
+ </p>
544
+
545
+ <p>
546
+ helloruby_2.rb
547
+ </p>
548
+ <div class="org-src-container">
549
+
550
+ <pre class="src src-ruby">print("Hello, RUBY!.\n")
551
+ </pre>
552
+ </div>
553
+
554
+ <p>
555
+  今度は大文字で「Hello,RUBY!」と表示するようになります。ちょっと元気の良いあいさつになりましたか?
556
+ </p>
557
+ </div>
558
+ </div>
559
+ </div>
560
+
561
+ <div id="outline-container-sec-1-4" class="outline-3">
562
+ <h3 id="sec-1-4"><span class="section-number-3">1.4</span> 文字列</h3>
563
+ <div class="outline-text-3" id="text-1-4">
564
+ </div><div id="outline-container-sec-1-4-1" class="outline-4">
565
+ <h4 id="sec-1-4-1">イントロダクション</h4>
566
+ <div class="outline-text-4" id="text-1-4-1">
567
+ <p>
568
+  文字列について、もう少し詳しくもう少し見ていくことにしましょう。
569
+ </p>
570
+ </div>
571
+ </div>
572
+
573
+ <div id="outline-container-sec-1-4-2" class="outline-4">
574
+ <h4 id="sec-1-4-2">1.3.1. 改行文字と「\」</h4>
575
+ <div class="outline-text-4" id="text-1-4-2">
576
+ <p>
577
+  先ほど、文字列の「\n」は改行を表すと説明しました。普通の文字を使って改行を書けるおかげで、たとえば
578
+ </p>
579
+
580
+ <p>
581
+ Hello,
582
+ Ruby
583
+ !
584
+ </p>
585
+
586
+ <p>
587
+  と表示させるには、
588
+ </p>
589
+
590
+ <div class="org-src-container">
591
+
592
+ <pre class="src src-ruby">print("Hello, \nRuby\n!\n")
593
+ </pre>
594
+ </div>
595
+
596
+ <p>
597
+  と書くことができます。もっとも、
598
+ </p>
599
+
600
+ <div class="org-src-container">
601
+
602
+ <pre class="src src-ruby">print("Hello,
603
+ Ruby
604
+ !
605
+ ")
606
+ </pre>
607
+ </div>
608
+
609
+ <p>
610
+  などと書いても、同じように表示されます。しかし、この書き方だとプログラムが読みにくくなってしまうので、あまり良い書き方ではありません。せっかく改行を表す書き方があるのですから、それを使う方が良いでしょう。
611
+  「\n」以外にも、文字列の中で特殊な文字を埋め込みたいときに「\」を使います。たとえば、「"」は文字列の始まりと終わりを表す文字ですが、これを文字列の中に含める場合には「\"」とします。
612
+ </p>
613
+
614
+
615
+ <p>
616
+ helloruby_3.rb
617
+ </p>
618
+ <div class="org-src-container">
619
+
620
+ <pre class="src src-ruby">print("Hello, \"Ruby\".\n")
621
+ </pre>
622
+ </div>
623
+
624
+ <p>
625
+  上記のプログラムは、
626
+ </p>
627
+
628
+ <p>
629
+ Hello, "Ruby".
630
+ </p>
631
+
632
+ <p>
633
+  と表示されます。
634
+  このように、文字列中の「\」はそれに続く文字に特別な意味を与える文字になっています。そのため、「\」そのものを文字列中に含めたい時には、「\\」とかく必要があります。たとえば
635
+ </p>
636
+
637
+ <div class="org-src-container">
638
+
639
+ <pre class="src src-ruby">print("Hello \\ Ruby!\n")
640
+ </pre>
641
+ </div>
642
+
643
+ <p>
644
+  上記のプログラムは、
645
+ </p>
646
+
647
+ <p>
648
+ Hello \ Ruby!
649
+ </p>
650
+
651
+ <p>
652
+  と表示されます。2つあった「\」が1つになっていることに注意してください。
653
+ </p>
654
+ </div>
655
+ </div>
656
+
657
+
658
+ <div id="outline-container-sec-1-4-3" class="outline-4">
659
+ <h4 id="sec-1-4-3">1.3.2. 「''」と「""」</h4>
660
+ <div class="outline-text-4" id="text-1-4-3">
661
+ <p>
662
+  文字列オブジェクトを作るための区切り文字には、「" "」(ダブルクォート)ではなく、「' '」(シングルクォート)を使うこともできます。先ほどのプログラムを
663
+ </p>
664
+
665
+ <p>
666
+ helloruby_4.rb
667
+ </p>
668
+ <div class="org-src-container">
669
+
670
+ <pre class="src src-ruby">print('Hello,\nRuby\n!\n')
671
+ </pre>
672
+ </div>
673
+
674
+ <p>
675
+  とシングルクォートに書き換えて実行してみましょう。すると今度は
676
+ </p>
677
+
678
+ <p>
679
+ Hello,\nRuby\n!\n
680
+ </p>
681
+
682
+ <p>
683
+  というように、「' '」の中の文字がそのまま表示されます。
684
+  このように「' '」で囲った文字列は、「\n」などの特殊文字の解釈を行わず、そのまま表示します。ただし例外として、「\」と「'」を、文字列中に文字そのものとして含めたいときのみ、その文字の前に「\」をつけます。こんな感じです。
685
+ </p>
686
+
687
+ <p>
688
+ helloruby_5.rb
689
+ </p>
690
+ <div class="org-src-container">
691
+
692
+ <pre class="src src-ruby">print('Hello, \\ \'Ruby\'.')
693
+ </pre>
694
+ </div>
695
+
696
+ <p>
697
+  実行すると次のように表示されます。
698
+ </p>
699
+
700
+ <p>
701
+ Hello, \ 'Ruby'.
702
+ </p>
703
+ </div>
704
+ </div>
705
+ </div>
706
+
707
+ <div id="outline-container-sec-1-5" class="outline-3">
708
+ <h3 id="sec-1-5"><span class="section-number-3">1.5</span> メソッドの呼び出し</h3>
709
+ <div class="outline-text-3" id="text-1-5">
710
+ <p>
711
+  メソッドについてもう少し説明しましょう。
712
+  Rubyのメソッドでは「()」を省略することができます。そのため、先ほどのプログラム(List1.1)でのprintメソッドは、
713
+ </p>
714
+
715
+ <p>
716
+ helloruby_6.rb
717
+ </p>
718
+ <div class="org-src-container">
719
+
720
+ <pre class="src src-ruby">print "Hello, Ruby.\n"
721
+ </pre>
722
+ </div>
723
+
724
+ <p>
725
+  と書くこともできます。
726
+  また、いくつかの文字列を続けて表示したい時には、「,」で区切れば、並べた順に表示できます。ですから
727
+ </p>
728
+
729
+ <div class="org-src-container">
730
+
731
+ <pre class="src src-ruby">print "Hello, ", "Ruby", ".", \n"
732
+ </pre>
733
+ </div>
734
+
735
+ <p>
736
+  なんて書き方もできるわけですね。これは、表示したいものがいくつもある時に使うと便利です。とはいえ、要素が複雑に込み入ってくると、「()」をつけたほうがわかりやすくなります。慣れるまではこまめに「()」を書いておきましょう。本書では、単純な場合には「()」を書いて表記しています。
737
+  さらに、メソッドを順に並べて書くと、その順にメソッドを実行します。例えば
738
+ </p>
739
+
740
+ <p>
741
+ helloruby_7.rb
742
+ </p>
743
+ <div class="org-src-container">
744
+
745
+ <pre class="src src-ruby">print "Hello, "
746
+ print "Ruby"
747
+ print "."
748
+ print "\n"
749
+ </pre>
750
+ </div>
751
+
752
+ <p>
753
+  などと書いても、同じように「Hello,Ruby.」と表示するプログラムになります。
754
+ </p>
755
+ </div>
756
+ </div>
757
+
758
+ <div id="outline-container-sec-1-6" class="outline-3">
759
+ <h3 id="sec-1-6"><span class="section-number-3">1.6</span> putsメソッド</h3>
760
+ <div class="outline-text-3" id="text-1-6">
761
+ <p>
762
+  printメソッド以外にも文字列を表示するメソッドがあります。putsメソッドは、printメソッドとは異なり、表示する文字列の最後で必ず改行します。これを使えば、List1.1は
763
+ </p>
764
+
765
+
766
+ <p>
767
+ helloruby_8.rb
768
+ </p>
769
+ <div class="org-src-container">
770
+
771
+ <pre class="src src-ruby">puts "Hello, Ruby."
772
+ </pre>
773
+ </div>
774
+
775
+ <p>
776
+  と書けるようになります。ただし、
777
+ </p>
778
+
779
+ <div class="org-src-container">
780
+
781
+ <pre class="src src-ruby">puts "Hello, ", "Ruby!"
782
+ </pre>
783
+ </div>
784
+
785
+ <p>
786
+  のように2つの文字列を渡した場合には、
787
+ </p>
788
+
789
+ <p>
790
+ Hello,
791
+ Ruby!
792
+ </p>
793
+
794
+ <p>
795
+  と、それぞれの文字列の末尾に改行が追加されます。printメソッドとは少し使い勝手が違いますね。この2つのメソッドは、場面に応じて使い分けてください。
796
+ </p>
797
+ </div>
798
+ </div>
799
+
800
+ <div id="outline-container-sec-1-7" class="outline-3">
801
+ <h3 id="sec-1-7"><span class="section-number-3">1.7</span> pメソッド</h3>
802
+ <div class="outline-text-3" id="text-1-7">
803
+ <p>
804
+  さらにもう1つ、表示のためのメソッドを紹介しましょう。オブジェクトの内容を表示する時に便利な「p」というメソッドです。
805
+  たとえば、数値の100と文字列の”"100"を、printメソッドやputsメソッドで表示させると、どちらも単に「100」と表示されてしまいます。これでは本当はどちらのオブジェクトなのか、表示結果から確認できません。そんな時には、pメソッドを使うのが便利です。pメソッドなら、文字列と数値を違った形で表示してくれるのです。さっそく試してみましょう。
806
+ </p>
807
+
808
+ <p>
809
+ puts "100" #=&gt; 100
810
+ puts 100 #=&gt; 100
811
+ p "100" #=&gt; "100"
812
+ p 100 #=&gt; 100
813
+ </p>
814
+
815
+ <p>
816
+ *メモ 本書では、プログラム中で出力した内容を表すために、出力用のメソッドの横に「#=&gt;」という文字を置き、その右側に出力された文字を並べて書くという表記を用いています。この例では、「puts "100"」や「puts 100」、「p 100」というメソッドでは、「100」という文字列が出力され、「p "100"」というメソッドでは「"100"」という文字列が出力される、という意味になります。
817
+ </p>
818
+
819
+ <p>
820
+  このように、文字列を出力する場合、「" "」で囲んで表示してくれるわけです。これなら一目瞭然ですね。さらに、文字列の中に含まれる改行やタブなどの特殊な文字も、「\n」や「\t」のように表示されます(List1.2)。
821
+ </p>
822
+
823
+ <p>
824
+ List1.2 puts_and_p.rb
825
+ </p>
826
+ <div class="org-src-container">
827
+
828
+ <pre class="src src-ruby">puts "Hello,\n\tRuby."
829
+ p "Hello,\n\tRuby."
830
+ </pre>
831
+ </div>
832
+
833
+ <p>
834
+  実行例は以下のようになります。
835
+ </p>
836
+
837
+ <p>
838
+ &gt; ruby puts_and_p.rb
839
+ Hello,
840
+ Ruby.
841
+ "Hello,\n\tRuby."
842
+ </p>
843
+
844
+ <p>
845
+  printメソッドは実行結果やメッセージなどを普通に表示したい時、pメソッドは実行中のプログラムの様子を確認したい時、と使い分ければ良いでしょう。原則として、pメソッドはプログラムを書いている人のためのメソッドなのです。
846
+ </p>
847
+ </div>
848
+ </div>
849
+
850
+ <div id="outline-container-sec-1-8" class="outline-3">
851
+ <h3 id="sec-1-8"><span class="section-number-3">1.8</span> 日本語の表示</h3>
852
+ <div class="outline-text-3" id="text-1-8">
853
+ <p>
854
+  ここまで、文字列にはアルファベット(英字)を使ってきました。
855
+  今度は日本語を表示してみましょう。日本語の表示も難しい事は何もありません。単にアルファベットの代わりに日本語を「" "」の中に書くだけです。こんな感じになります。
856
+ </p>
857
+
858
+ <p>
859
+ List1.3 kiritsubo.rb
860
+ </p>
861
+ <div class="org-src-container">
862
+
863
+ <pre class="src src-ruby">print "いづれの御時にか女御更衣あまたさぶらいたまいけるなかに\n"
864
+ print "いとなむごとなき際にはあらぬがすぐれて時めきたまふありけり\n"
865
+ </pre>
866
+ </div>
867
+
868
+ <p>
869
+  ただし、文字コードの設定によっては、エラーが出たり、正しく表示されない場合があります。その場合、コラム「日本語を扱う場合の注意」を参照してください。
870
+ </p>
871
+ </div>
872
+
873
+ <div id="outline-container-sec-1-8-1" class="outline-4">
874
+ <h4 id="sec-1-8-1">コラム「日本語を扱う場合の注意」</h4>
875
+ <div class="outline-text-4" id="text-1-8-1">
876
+ <p>
877
+  環境によっては、日本語を含むスクリプトを実行すると次のようなエラーになります。
878
+ </p>
879
+
880
+ <p>
881
+ 実行例
882
+ </p>
883
+
884
+ <p>
885
+ &gt; ruby kiritsubo.rb
886
+ kiritsubo.rb:1: invalid multibyte char (UTF-8)
887
+ kiritsubo.rb:1: invalid multibyte char (UTF-8)
888
+ </p>
889
+
890
+ <p>
891
+  これはソースコードの文字コード(エンコーディング)が指定されていないからです。Rubyでは「# encoding: 文字コード」というコメントを1行目に記述することによってソースコードの文字コードを指定します(文字コードを決めるルールのことをエンコーディングと言います)。このコメントをマジックコメントと言います。
892
+  Windowsで一般的に使われているエンコーディングShift_JISでソースコードを記述した場合は、次のようにマジックコメントを書きます。
893
+ </p>
894
+
895
+
896
+ <div class="org-src-container">
897
+
898
+ <pre class="src src-ruby"># encoding: Shift_JIS
899
+ print "いづれの御時にか女御更衣あまたさぶらいたまいけるなかに\n"
900
+ print "いとなむごとなき際にはあらぬがすぐれて時めきたまふありけり\n"
901
+ </pre>
902
+ </div>
903
+
904
+ <p>
905
+  このようにコメントで文字コードを指定することによって、Rubyがソースコード中の日本語を正しく認識できるようになります。次の表にプラットフォームごとによく使われる文字コードをまとめています。複数の文字コード名が挙げられている場合は、環境に合わせて適切なものを選んでください。
906
+ </p>
907
+
908
+
909
+
910
+
911
+
912
+ <p>
913
+  なお、マジックコメントがないソースコードの文字コードはUTF-8と仮定されます。そのため、UTF-8のソースコードを使う場合はマジックコメントは不要です。
914
+  これ以外でも、前述のpメソッドで日本語の文字列を出力すると、いわゆる「文字化け」をしたような出力になる場合があります。そのような場合が、出力用の文字コードを指定するために「-E 文字コード」の形式でコマンドラインオプションを指定してください。コンソールがUTF-8を受け付ける場合は次のようにします。
915
+ </p>
916
+
917
+ <p>
918
+ 実行例
919
+ </p>
920
+
921
+ <p>
922
+ &gt; ruby -E UTF-8 スクリプトファイル名
923
+ &gt; irb -E UTF-8
924
+ </p>
925
+ </div>
926
+ </div>
927
+ </div>
928
+
929
+ <div id="outline-container-sec-1-9" class="outline-3">
930
+ <h3 id="sec-1-9"><span class="section-number-3">1.9</span> 数値の表示と計算</h3>
931
+ <div class="outline-text-3" id="text-1-9">
932
+ </div><div id="outline-container-sec-1-9-1" class="outline-4">
933
+ <h4 id="sec-1-9-1">イントロダクション</h4>
934
+ <div class="outline-text-4" id="text-1-9-1">
935
+ <p>
936
+  文字列に続いて、今度は「数値」を扱ってみましょう。Rubyのプログラムでは、整数や少数(浮動小数点数)を、自然な形で扱うことができます。
937
+ </p>
938
+ </div>
939
+ </div>
940
+
941
+ <div id="outline-container-sec-1-9-2" class="outline-4">
942
+ <h4 id="sec-1-9-2">1.8.1. 数値の表示</h4>
943
+ <div class="outline-text-4" id="text-1-9-2">
944
+ <p>
945
+  まずは文字列の代わりに数値を表示するところから始めてみます。「1.2 プログラムの解説」で、「Rubyでは文字列は文字列オブジェクトという形になっている」と説明しました。同じように、数値も「数値オブジェクト」として扱われます。
946
+  Rubyで整数オブジェクトを表現するのは簡単です。そのまま数字を書けば良いだけです。たとえば
947
+ </p>
948
+
949
+ <p>
950
+ 1
951
+ </p>
952
+
953
+ <p>
954
+  と書けば「1」の値の整数(Fixnum)オブジェクトになります。また、
955
+ </p>
956
+
957
+ <p>
958
+ 100
959
+ </p>
960
+
961
+ <p>
962
+  と書けば、「100」の値の整数オブジェクトになります。
963
+  さらに、
964
+ </p>
965
+
966
+ <p>
967
+ 3.1415
968
+ </p>
969
+
970
+ <p>
971
+  などと書けば、「3.1415」の値の浮動小数点数(Float)オブジェクトになります。
972
+ </p>
973
+
974
+ <p>
975
+ *メモ 「Fixnum」や「Float」というのは、それぞれのオブジェクトが所属する「クラス」の名前です。クラスについては、第4章と第8章で説明します。
976
+ </p>
977
+
978
+ <p>
979
+  数値を表示するには、文字列と同様にprintメソッドやputsメソッドを使います。
980
+ </p>
981
+
982
+ <p>
983
+ puts(10)
984
+ </p>
985
+
986
+ <p>
987
+  というメソッドを実行すると、
988
+ </p>
989
+
990
+ <p>
991
+ 10
992
+ </p>
993
+
994
+ <p>
995
+  と画面に表示されます。
996
+ </p>
997
+ </div>
998
+ </div>
999
+
1000
+
1001
+ <div id="outline-container-sec-1-9-3" class="outline-4">
1002
+ <h4 id="sec-1-9-3">1.8.2. 四則演算</h4>
1003
+ <div class="outline-text-4" id="text-1-9-3">
1004
+ <p>
1005
+  数の計算を行ったり、その結果を表示したりすることもできます。四則演算をやってみましょう。
1006
+  ここではirbコマンドを使ってみます。
1007
+ </p>
1008
+
1009
+ <p>
1010
+ 実行例
1011
+ </p>
1012
+
1013
+ <p>
1014
+ &gt; irb &#x2013;simple-prompt
1015
+ &gt;&gt; 1 + 1
1016
+ =&gt; 2
1017
+ &gt;&gt; 2 - 3
1018
+ =&gt; -1
1019
+ &gt;&gt; 5 * 10
1020
+ =&gt; 50
1021
+ &gt;&gt; 100 / 4
1022
+ =&gt; 25
1023
+ </p>
1024
+
1025
+ <p>
1026
+ *メモ irbコマンドの後の&#x2013;simple-promptは、irbのプロンプト表示を簡易にするためのオプションです。
1027
+ </p>
1028
+
1029
+ <p>
1030
+  プログラミング言語の世界では、掛け算の記号に「*」(アスタリスク)を、割り算の記号に「/」(スラッシュ)を使うのが一般的です。Rubyもこの習慣にならっています。
1031
+  もう少し四則演算をやってみましょう。普通の計算では、「足し算・引き算」と「掛け算・割り算」には計算の順序が決められていますが、Rubyでも同じです。つまり、
1032
+ </p>
1033
+
1034
+ <p>
1035
+ 20 + 8 / 2
1036
+ </p>
1037
+
1038
+ <p>
1039
+  とすれば答えは「24」になります。「20 + 8」を2で割りたいときは、「()」で囲って、
1040
+ </p>
1041
+
1042
+ <p>
1043
+ (20 + 8) / 2
1044
+ </p>
1045
+
1046
+ <p>
1047
+  とします。答えは「14」になります。
1048
+ </p>
1049
+ </div>
1050
+ </div>
1051
+
1052
+
1053
+ <div id="outline-container-sec-1-9-4" class="outline-4">
1054
+ <h4 id="sec-1-9-4">1.8.3. 数学的な関数</h4>
1055
+ <div class="outline-text-4" id="text-1-9-4">
1056
+ <p>
1057
+  四則演算以外にも、平方根や、三角関数の「sin」「cos」、指数関数などの数学的な関数が利用できます。ただし、その場合、関数の前に「Math.」という文字列をつける必要があります。
1058
+ </p>
1059
+
1060
+ <p>
1061
+ *メモ 「Math.」をつけずに「sin」「cos」などの関数を使うには、「include Math」という文が必要です。これについては「8.7.2 名前空間の提供」で説明します。
1062
+ </p>
1063
+
1064
+ <p>
1065
+  sinはsinメソッド、平方根はsqrtメソッドで求めます。メソッドを実行すると、計算した結果を得ることができます。このことを「メソッドが値を返す」といい、得られる値のことを戻り値といいます。
1066
+ </p>
1067
+ <p>
1068
+ 実行例
1069
+ </p>
1070
+
1071
+ <p>
1072
+ &gt; irb &#x2013;simple-prompt
1073
+ &gt;&gt; Math.sin(3.1415)
1074
+ =&gt; 9.265358966049024e-05
1075
+ &gt;&gt; Math.sqrt(10000)
1076
+ =&gt; 100.0
1077
+ </p>
1078
+
1079
+ <p>
1080
+ *注 Rubyのバージョンや実行する環境により、結果の桁数などが異なる場合があります。
1081
+ </p>
1082
+
1083
+ <p>
1084
+  1番目のsinの答えである「9.265358966049024e-05」ですが、これは、極端に大きい数や、極端に小さい数を表す時に使われる表記方法です。「(小数)0(整数)」と表示された時は、「(小数)*(10の(整数)乗)」の値、と解釈してください。この例の場合、「9.265358966049024×10の−5」ということになるの、つまりは0.00009265358966049024という値を表しています。
1085
+ </p>
1086
+ </div>
1087
+ </div>
1088
+ </div>
1089
+
1090
+ <div id="outline-container-sec-1-10" class="outline-3">
1091
+ <h3 id="sec-1-10"><span class="section-number-3">1.10</span> 変数</h3>
1092
+ <div class="outline-text-3" id="text-1-10">
1093
+ <p>
1094
+  プログラミングに欠かせない要素として変数があります。変数とは、「もの」につける名札のようなものです。
1095
+  オブジェクトに名札をつけるには、
1096
+ </p>
1097
+
1098
+ <p>
1099
+ 変数名 = オブジェクト
1100
+ </p>
1101
+
1102
+ <p>
1103
+  と書きます。このことを「変数にオブジェクトを代入するといいます。
1104
+ </p>
1105
+
1106
+ <p>
1107
+
1108
+ </p>
1109
+
1110
+ <p>
1111
+ alphabet = "abcdefg"
1112
+ num = 10
1113
+ age = 18
1114
+ name = "TAKAHASHI"
1115
+ </p>
1116
+
1117
+ <p>
1118
+  変数の利用例として、直方体の表面積と体積を求めるプログラム(List1.4)を見てみましょう。
1119
+ </p>
1120
+
1121
+ <p>
1122
+ List1.4 area_volume.rb
1123
+ </p>
1124
+ <div class="org-src-container">
1125
+
1126
+ <pre class="src src-ruby">x = 10
1127
+ y = 20
1128
+ z = 30
1129
+ area = (x*y + y*z + z*x) * 2
1130
+ volume = x * y * z
1131
+ print "表面積=", area, "\n"
1132
+ print "体積=", volume, "\n"
1133
+ </pre>
1134
+ </div>
1135
+
1136
+ <p>
1137
+  変数をまったく使わなければ、
1138
+ </p>
1139
+
1140
+ <div class="org-src-container">
1141
+
1142
+ <pre class="src src-ruby">print "表面積=", (10+20 + 20*30 + 30*10) * 2, "\n"
1143
+ print "体積=", 10*20*30, "\n"
1144
+ </pre>
1145
+ </div>
1146
+
1147
+ <p>
1148
+  といったプログラムになってしまいます。これでは値を1つ変更するために何箇所も修正しなければいけません。この例はたったの2行なので大したことはありませんが、ちょっと大きなプログラムになると、そのような変更をきちんと行うのは大変な手間となります。また、変数には、あたいが何をしているのかを明確にするという意味もあります。したがって、わかりやすい名前をつけることが大切です。例えば、
1149
+ </p>
1150
+
1151
+
1152
+ <div class="org-src-container">
1153
+
1154
+ <pre class="src src-ruby">hoge = (foo*bar + bar*baz + baz*foo) * 2
1155
+ huni = foo * bar * baz
1156
+ </pre>
1157
+ </div>
1158
+
1159
+ <p>
1160
+  という調子では、何をやっているのかさっぱりわからないプログラムになってしまいます。変数名には、「area」や「volume」など、そのままで意味のわかる単語などを使うように、普段から心がけましょう。
1161
+ </p>
1162
+ </div>
1163
+
1164
+ <div id="outline-container-sec-1-10-1" class="outline-4">
1165
+ <h4 id="sec-1-10-1">1.9.1. printメソッドと変数</h4>
1166
+ <div class="outline-text-4" id="text-1-10-1">
1167
+ <p>
1168
+  printメソッドの動きをもう少し見てみましょう。
1169
+ </p>
1170
+
1171
+ <p>
1172
+ print "表面積=", area, "\n"
1173
+ </p>
1174
+
1175
+ <p>
1176
+  このprintメソッドの呼び出しには「"表面積="」「area」「"\n"」の3つの引数を指定しています。printメソッドはこれらの引数の値を順番に出力します。
1177
+  「"表面積="」は「表面=」という値を持った文字列なので、それがそのまま出力されます。「area」はareaという変数に関連づけられたオブジェクトになります。この例では2200という整数になっているので、printメソッドはその値を出力します。
1178
+  最後の「"\n"」は改行を表す文字列なので、そのまま出力します。
1179
+  これらの3つの値をprintメソッドで処理した結果として「表面積=2200」と改行が画面に表示されるというわけです。
1180
+  printメソッドに渡す文字列は次のように書くこともできます。
1181
+ </p>
1182
+
1183
+ <p>
1184
+ print "表面積=#{area}\n"
1185
+ </p>
1186
+
1187
+ <p>
1188
+  「"表面積=#{area}\n"」が全体で1つの文字列になっています。「#{area}」は文字列の中に変数areaの値を埋め込むという書き方です。文字列の中に「#{変数名}」と書くと、文字列にデータを埋め込むことができます。計算結果の変数名を埋め込む代わりに、「"表面積=#{(x*y + y*z + z*x) * 2}\n"」のように計算式を直接描いても同じ結果を得られます。
1189
+  画面に結果を出力する場合は改行も出力することが多いため、putsメソッドを使って次のように書けば、「\n」も必要なくなり、プログラムがスッキリします。
1190
+ </p>
1191
+
1192
+ <p>
1193
+ puts "表面積=#{area}"
1194
+ </p>
1195
+ </div>
1196
+ </div>
1197
+ </div>
1198
+
1199
+ <div id="outline-container-sec-1-11" class="outline-3">
1200
+ <h3 id="sec-1-11"><span class="section-number-3">1.11</span> コメントを書く</h3>
1201
+ <div class="outline-text-3" id="text-1-11">
1202
+ <p>
1203
+  プログラムの中には、コメントを書くことができます。コメントは、プログラム中にp書かれていても、直接プログラムとしては扱われません。つまり、プログラムの実行には何の関係もないもの、ということです。「どうしてプログラムの中に、実行とは関係のない余計なものを書くのだろう?」と思われるかもしれません。確かに一度書いて実行すればそれっきり、というプログラムであれば、コメントは特に必要ないでしょう。しかし、一度書いたプログラムを何度も使いまわすことも少なくありません。そのような時に、
1204
+ </p>
1205
+
1206
+ <p>
1207
+ ・プログラムの名前や作者、配布条件などの情報
1208
+ ・プログラムの説明
1209
+ </p>
1210
+
1211
+ <p>
1212
+  などを書いておくために、コメントが使われます。
1213
+  コメントを表す記号は「#」です。行頭に「#」があれば、1行まるまるコメントになります。行の途中に「#」があれば、「#」の部分から行末までがすべてコメントになります。また、行頭から始まる「=begin」と「=end」で囲まれた部分もコメントになります。これは、プログラムの先頭や最後で、長い説明を記しておくのに重宝します。
1214
+ List1.5は、先ほどのList1.4にコメントを追加したプログラムです。
1215
+ </p>
1216
+
1217
+ <p>
1218
+ List1.5 comment_sample.rb
1219
+ </p>
1220
+ <div class="org-src-container">
1221
+
1222
+ <pre class="src src-ruby">=begin
1223
+ 「たのしいRuby 第5版」サンプル
1224
+ コメントの使い方の例
1225
+ 2006/06/16 作成
1226
+ 2006/07/01 一部コメントを追加
1227
+ 2015/10/01 第5版に更新
1228
+ =end
1229
+ x = 10 # 横
1230
+ y = 20 # 縦
1231
+ z = 30 # 高さ
1232
+ # 表面積と体積を計算する
1233
+ area = (x*y + y*z + z*x) * 2
1234
+ volume = x * y * z
1235
+ # 出力する
1236
+ print "表面積=", area, "\n"
1237
+ print "体積=", volume, "\n"
1238
+ </pre>
1239
+ </div>
1240
+
1241
+ <p>
1242
+  なお、コメントは、先ほど挙げた目的以外にも、「この行の処理を一時的に実行させないようにする」といったことにも使います。
1243
+  C言語のコメントのように、行の途中だけをコメントにするような書き方はありません。行末まで必ずコメントになります。
1244
+ </p>
1245
+ </div>
1246
+ </div>
1247
+
1248
+ <div id="outline-container-sec-1-12" class="outline-3">
1249
+ <h3 id="sec-1-12"><span class="section-number-3">1.12</span> 制御構造</h3>
1250
+ <div class="outline-text-3" id="text-1-12">
1251
+ </div><div id="outline-container-sec-1-12-1" class="outline-4">
1252
+ <h4 id="sec-1-12-1">イントロダクション</h4>
1253
+ <div class="outline-text-4" id="text-1-12-1">
1254
+ <p>
1255
+  プログラミング言語には、制御構造というものがあります。
1256
+  これは、何かの条件によって、プログラムの実行順序を変えたり、プログラムの一部を実行させなかったりするための仕掛けです。
1257
+ </p>
1258
+ </div>
1259
+ </div>
1260
+
1261
+ <div id="outline-container-sec-1-12-2" class="outline-4">
1262
+ <h4 id="sec-1-12-2">1.11.1. 制御構造の分類</h4>
1263
+ <div class="outline-text-4" id="text-1-12-2">
1264
+ <p>
1265
+  制御構造を大雑把に分類すると次のようになります。
1266
+ </p>
1267
+
1268
+ <p>
1269
+ ・逐次処理:プログラムを書かれた通りに、先頭から順に実行する。
1270
+ ・条件判断:ある条件が成り立つ場合は〇〇を、そうでない場合は××を実行する
1271
+ ・繰り返し:ある条件が成り立つ間、〇〇を繰り返し実行する
1272
+ ・例外処理:何か例外が発生した場合には、〇〇を実行する
1273
+ </p>
1274
+
1275
+ <p>
1276
+  逐次処理というのは、通常の処理のことです。特に何も指定していない場合、プログラムは書かれた順に実行されます。
1277
+  条件判断は、条件に応じて処理が分岐します。条件が満たされない場合、書かれた処理の一部を飛ばして、実行が行われます。Rubyでは、if文やunless文、case文などが条件判断文になります。
1278
+  繰り返しは、条件に応じて、ある処理を何度も繰り返して実行することです。この場合、書かれた順序に逆らって、すでに一度実行されているところに戻って、再度実行が行われます。
1279
+  例外処理はやや特殊です。想定していない問題が発生した時、それまで実行していた部分を抜け出して、別の場所から実行を再開する処理です。場合によっては、そこでプログラムが終了してしまうこともあります。
1280
+  ここでは「条件判断」と「繰り返し」を取り上げます。
1281
+ </p>
1282
+ </div>
1283
+ </div>
1284
+ </div>
1285
+
1286
+ <div id="outline-container-sec-1-13" class="outline-3">
1287
+ <h3 id="sec-1-13"><span class="section-number-3">1.13</span> 条件判断:if ~ then ~ end</h3>
1288
+ <div class="outline-text-3" id="text-1-13">
1289
+ <p>
1290
+  ある条件によって挙動が変わるプログラムを作るには、if文を使います。if文の構文は、次のようになります。
1291
+ </p>
1292
+
1293
+ <p>
1294
+ if 条件 then
1295
+ 条件が成り立った時に実行したい処理
1296
+ end
1297
+ </p>
1298
+
1299
+ <p>
1300
+  条件には、値がtrueまたはfalseとなる式を書くのが一般的です。2つの値を比較して、一致すればtrue、一致しなければfalse、などが条件にあたります。
1301
+  数値の場合、例えば大小関係の比較には、等号や不等号を使います。Rubyでは、「=」は代入のための記号として使われるので、一致するかどうか調べるには「=」を2つ並べた記号「==」を使います。また、「≦」と「≧」には、「&lt;=」と「&gt;=」を使います。
1302
+  このような比較の結果はtrueまたはfalseとなります。もちろん、trueはその条件が成り立っている場合、falseは成り立っていない場合です。
1303
+ </p>
1304
+
1305
+ <p>
1306
+ p (2 <code>= 2) #=&gt; true
1307
+ p (1 =</code> 2) #=&gt; false
1308
+ p (3 &gt; 1) #=&gt; true
1309
+ p (3 &gt; 3) #=&gt; false
1310
+ p (3 &gt;= 3) #=&gt; true
1311
+ p (3 &lt; 1) #=&gt; false
1312
+ p (3 &lt; 3) #=&gt; false
1313
+ p (3 &lt;= 3) #=&gt; true
1314
+ </p>
1315
+
1316
+ <p>
1317
+  文字列の比較もできます。この場合も「==」を使います。同じ文字列ならtrue、異なる文字列ならfalseを返します。
1318
+ </p>
1319
+
1320
+ <p>
1321
+ p ("Ruby" <code>= "Ruby") #=&gt;true
1322
+ p ("Ruby" =</code> "Rubens") #=&gt;false
1323
+ </p>
1324
+
1325
+ <p>
1326
+  値が異なっていることを判断するには、「!=」を使います。これは「≠」の意味ですね。
1327
+ </p>
1328
+
1329
+ <p>
1330
+ p ("Ruby" != "Rubens") #=&gt; true
1331
+ p (1 != 1) #=&gt; false
1332
+ </p>
1333
+
1334
+ <p>
1335
+  では、これらを使って、条件判断文を書いてみましょう。変数aの値が10以上の場合は「greater」、9以下の場合は「smaller」と表示するプログラムはList1.6のようになります。
1336
+ </p>
1337
+
1338
+ <p>
1339
+ List1.6 greater_smaller.rb
1340
+ </p>
1341
+ <div class="org-src-container">
1342
+
1343
+ <pre class="src src-ruby">a = 20
1344
+ if a &gt;= 10 then
1345
+ print "greater\n"
1346
+ end
1347
+ if a &lt;= 9 then
1348
+ print "smaller\n"
1349
+ end
1350
+ </pre>
1351
+ </div>
1352
+
1353
+ <p>
1354
+  thenは省略することもできます。その場合、if文は次のようになります。
1355
+ </p>
1356
+
1357
+ <p>
1358
+ if a &gt;= 10
1359
+ print "greater\n"
1360
+ end
1361
+ </p>
1362
+
1363
+ <p>
1364
+  また、条件に一致するときとしないときで違う動作をさせたい場合は、else文を使います。次のような構文になります。
1365
+ </p>
1366
+
1367
+ <p>
1368
+ if 条件 then
1369
+ 条件が成り立った時に実行したい処理
1370
+ else
1371
+ 条件が成り立たなかった時に実行したい処理
1372
+ end
1373
+ </p>
1374
+
1375
+ <p>
1376
+  これを使って、List1.6を書き直すと、List1.7のようになります。
1377
+ </p>
1378
+
1379
+ <p>
1380
+ List1.7 greater_smaller_else.rb
1381
+ </p>
1382
+ <div class="org-src-container">
1383
+
1384
+ <pre class="src src-ruby">a = 20
1385
+ if a &gt;= 10
1386
+ print "greater\n"
1387
+ else
1388
+ print "smaller\n"
1389
+ end
1390
+ </pre>
1391
+ </div>
1392
+ </div>
1393
+ </div>
1394
+
1395
+ <div id="outline-container-sec-1-14" class="outline-3">
1396
+ <h3 id="sec-1-14"><span class="section-number-3">1.14</span> 繰り返し</h3>
1397
+ <div class="outline-text-3" id="text-1-14">
1398
+ </div><div id="outline-container-sec-1-14-1" class="outline-4">
1399
+ <h4 id="sec-1-14-1">イントロダクション</h4>
1400
+ <div class="outline-text-4" id="text-1-14-1">
1401
+ <p>
1402
+  同じこと、または同じようなことを何度か繰り返したい場合があります。繰り返し処理を行う方法を2つ紹介しましょう。
1403
+ </p>
1404
+ </div>
1405
+ </div>
1406
+
1407
+ <div id="outline-container-sec-1-14-2" class="outline-4">
1408
+ <h4 id="sec-1-14-2">while文</h4>
1409
+ <div class="outline-text-4" id="text-1-14-2">
1410
+ <p>
1411
+  while文は、繰り返しを行うための基本的な構文です。なお、doは省略することもできます。
1412
+ </p>
1413
+
1414
+ <p>
1415
+ while 繰り返し続ける条件 do
1416
+ 繰り返したい処理
1417
+ end
1418
+ </p>
1419
+
1420
+ <p>
1421
+ 例:1から10までの数を順番に表示する
1422
+ </p>
1423
+
1424
+ <div class="org-src-container">
1425
+
1426
+ <pre class="src src-ruby">i = 1
1427
+ while i &lt;= 10
1428
+ print i, "\n"
1429
+ i = i + 1
1430
+ end
1431
+ </pre>
1432
+ </div>
1433
+ </div>
1434
+ </div>
1435
+
1436
+ <div id="outline-container-sec-1-14-3" class="outline-4">
1437
+ <h4 id="sec-1-14-3">timesメソッド</h4>
1438
+ <div class="outline-text-4" id="text-1-14-3">
1439
+ <p>
1440
+  繰り返しの回数が決まっているときは、「times」というメソッドを使うとシンプルにできます。なお、こちらの「do」は省略できません。
1441
+ </p>
1442
+
1443
+ <p>
1444
+ 繰り返す回数.times do
1445
+ 繰り返したい処理
1446
+ end
1447
+ </p>
1448
+
1449
+ <p>
1450
+ 例:「All work and no play makes Jack a dull boy.」と100行表示する
1451
+ </p>
1452
+
1453
+ <div class="org-src-container">
1454
+
1455
+ <pre class="src src-ruby">100.times do
1456
+ print "All work and no play makes Jack a dull boy.\n"
1457
+ end
1458
+ </pre>
1459
+ </div>
1460
+
1461
+ <p>
1462
+  timesメソッドはイテレータと呼ばれるメソッドです。イテレータ(iterator)は、Rubyの特徴的な機能です。スペルからもわかるように「繰り返す(iterate)もの(-or)」という意味です。オペレータ(operator)が「演算(operate)するもの」として「演算子」と呼ばれるのを真似るなら、さしずめ「繰り返し子」「反復子」というところでしょうか。その名の通り、繰り返しを行うためのメソッドです。
1463
+  Rubyはtimesメソッド以外にも数多くのイテレータを提供しています。イテレータの代表はeachメソッドです。eachメソッドについては、第2章で配列やハッシュと一緒に紹介します。
1464
+ </p>
1465
+ </div>
1466
+ </div>
1467
+ </div>
1468
+ </div>
1469
+
1470
+
1471
+ <div id="outline-container-sec-2" class="outline-2">
1472
+ <h2 id="sec-2"><span class="section-number-2">2</span> 便利なオブジェクト</h2>
1473
+ <div class="outline-text-2" id="text-2">
1474
+ </div>
1475
+
1476
+ <div id="outline-container-sec-2-1" class="outline-3">
1477
+ <h3 id="sec-2-1"><span class="section-number-3">2.1</span> イントロダクション</h3>
1478
+ <div class="outline-text-3" id="text-2-1">
1479
+ <p>
1480
+  第1章では、Rubyで扱う基本的なデータとして「文字列」と「数値」を取り上げましたが、Rubyで扱えるオブジェクトはこれだけではありません。多くのRubyのプログラムでは、もっと複雑なデータを扱うことになるでしょう。
1481
+  Rubyでアドレス帳を作ることを考えてみます。アドレス帳に必要な項目は、
1482
+ </p>
1483
+
1484
+ <p>
1485
+ ・名前    ・電話番号
1486
+ ・ふりがな  ・メールアドレス
1487
+ ・郵便番号  ・SNSのID
1488
+ ・住所    ・登録日
1489
+ </p>
1490
+
1491
+ <p>
1492
+ といったところでしょうか。これらはいずれも文字列で表現できそうです。
1493
+  これらの項目をひとまとめにすることで、1人分の情報になります。さらに、交友関係の人たちの情報が集まって、アドレス帳全体のデータが出来上がるわけです。
1494
+ </p>
1495
+
1496
+
1497
+ <p>
1498
+  このようにデータとデータを合わせた1つのデータを表すには、これまでに紹介した「文字列」や「数値」といった単純なオブジェクト以外に、データの集まりを表現するデータ構造が必要になります。
1499
+  この章では、「配列」と「ハッシュ」というデータ構造を紹介します。また、「正規表現」という、文字列処理に使われるオブジェクトも紹介します。
1500
+ </p>
1501
+
1502
+ <p>
1503
+ *メモ 配列やハッシュのようにオブジェクトを格納するオブジェクトを、コンテナやコレクションと言います。
1504
+ </p>
1505
+
1506
+ <p>
1507
+  配列・ハッシュ・正規表現はさまざまな場面で使われますが、より詳しい説明は後の章で行うことにして、ここではごく大まかにイメージをつかむことを目的に解説します。
1508
+ </p>
1509
+ </div>
1510
+ </div>
1511
+
1512
+ <div id="outline-container-sec-2-2" class="outline-3">
1513
+ <h3 id="sec-2-2"><span class="section-number-3">2.2</span> 配列(array)</h3>
1514
+ <div class="outline-text-3" id="text-2-2">
1515
+ </div><div id="outline-container-sec-2-2-1" class="outline-4">
1516
+ <h4 id="sec-2-2-1">イントロダクション</h4>
1517
+ <div class="outline-text-4" id="text-2-2-1">
1518
+ <p>
1519
+  配列は「いくつかのオブジェクトを順序付きで格納したオブジェクト」として、もっとも基本的でよく使われるコンテナです。「配列オブジェクト」「Arrayオブジェクト」などと呼ばれることもあります。
1520
+ </p>
1521
+ </div>
1522
+ </div>
1523
+
1524
+ <div id="outline-container-sec-2-2-2" class="outline-4">
1525
+ <h4 id="sec-2-2-2">2.1.1. 配列を作る</h4>
1526
+ <div class="outline-text-4" id="text-2-2-2">
1527
+ <p>
1528
+  新しい配列を作るには、要素をカンマ区切りで並べて、「[]」で全体を囲みます。まずは簡単な、文字列の配列を作ってみましょう。
1529
+ </p>
1530
+
1531
+ <p>
1532
+ names = ["小林", "林", "高野", "森岡"]
1533
+ </p>
1534
+
1535
+ <p>
1536
+  この例では、namesという配列オブジェクトが作られました。各要素として「"小林"」「"林"」「"高野"」「"森岡"」という4つの文字列を格納しています。
1537
+ </p>
1538
+ </div>
1539
+ </div>
1540
+
1541
+ <div id="outline-container-sec-2-2-3" class="outline-4">
1542
+ <h4 id="sec-2-2-3">2.1.2. 配列オブジェクト</h4>
1543
+ <div class="outline-text-4" id="text-2-2-3">
1544
+ <p>
1545
+  配列の要素となるオブジェクトが決まっていない場合には、「[]」とだけ書くと、空の配列オブジェクトができます。
1546
+ </p>
1547
+
1548
+ <p>
1549
+ names = []
1550
+ </p>
1551
+
1552
+ <p>
1553
+  これ以外にも配列の作り方はいくつかあります。詳しくは「第13章 配列
1554
+ (Array)クラス」で説明します。
1555
+ </p>
1556
+ </div>
1557
+ </div>
1558
+
1559
+ <div id="outline-container-sec-2-2-4" class="outline-4">
1560
+ <h4 id="sec-2-2-4">2.1.3. 配列からオブジェクトを取り出す</h4>
1561
+ <div class="outline-text-4" id="text-2-2-4">
1562
+ <p>
1563
+  配列に格納されたオブジェクトには、位置を表す番号であるインデックスがつきます。このインデックスを使って、オブジェクトを格納したり、取り出したりできます。
1564
+  配列の要素を取り出すには、
1565
+ </p>
1566
+
1567
+ <p>
1568
+ 配列名[インデックス]
1569
+ </p>
1570
+
1571
+ <p>
1572
+ という構文を使います。例えば、namesという名前の配列オブジェクトを次のように作ったとします。
1573
+ </p>
1574
+
1575
+ <p>
1576
+ names = ["小林", "林", "高野", "森岡"]
1577
+ </p>
1578
+
1579
+ <p>
1580
+  配列namesの最初の要素である「小林」という文字列を取り出すには、
1581
+ </p>
1582
+
1583
+ <p>
1584
+ names<sup><a id="fnr.1" name="fnr.1" class="footref" href="#fn.1">1</a></sup>
1585
+ </p>
1586
+
1587
+ <p>
1588
+ と書きます。そのため、
1589
+ </p>
1590
+
1591
+ <p>
1592
+ print "最初の名前は", names<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup>, "です。\n"
1593
+ </p>
1594
+
1595
+ <p>
1596
+ という文を実行すると、
1597
+ </p>
1598
+
1599
+ <p>
1600
+ 最初の名前は小林です。
1601
+ </p>
1602
+
1603
+ <p>
1604
+ と表示されます。同様に、names<sup><a id="fnr.2" name="fnr.2" class="footref" href="#fn.2">2</a></sup>は"林"、names<sup><a id="fnr.3" name="fnr.3" class="footref" href="#fn.3">3</a></sup>は"高野"になります。
1605
+ </p>
1606
+
1607
+ <p>
1608
+ 実行例
1609
+ </p>
1610
+
1611
+ <p>
1612
+ &gt; irb &#x2013;simple-prompt
1613
+ &gt;&gt; names = ["小林", "林", "高野", "森岡"]
1614
+ =&gt; ["小林", "林", "高野", "森岡"]
1615
+ &gt;&gt; names<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup>
1616
+ =&gt; "小林"
1617
+ &gt;&gt; names<sup><a id="fnr.2.100" name="fnr.2.100" class="footref" href="#fn.2">2</a></sup>
1618
+ =&gt; "林"
1619
+ &gt;&gt; names<sup><a id="fnr.3.100" name="fnr.3.100" class="footref" href="#fn.3">3</a></sup>
1620
+ =&gt; "高野"
1621
+ &gt;&gt; names<sup><a id="fnr.4" name="fnr.4" class="footref" href="#fn.4">4</a></sup>
1622
+ =&gt; "森岡"
1623
+ *メモ 配列のインデックスは0から始まります。1ではありません。ですから、a<sup><a id="fnr.2.100" name="fnr.2.100" class="footref" href="#fn.2">2</a></sup>と書くと、aという配列オブジェクトの先頭の要素ではなく、2番目の要素が返ってきます。慣れるまでは間違いやすいかもしれません(慣れていても間違いやすいところです)。注意してください。
1624
+ </p>
1625
+
1626
+ <p>
1627
+ *注 Windowsのコマンドプロンプトで日本語入力モードに切り替えるには、[半角/全角]キーを押します。
1628
+ </p>
1629
+ </div>
1630
+ </div>
1631
+
1632
+ <div id="outline-container-sec-2-2-5" class="outline-4">
1633
+ <h4 id="sec-2-2-5">2.1.4. 配列にオブジェクトを格納する</h4>
1634
+ <div class="outline-text-4" id="text-2-2-5">
1635
+ <p>
1636
+  すでにある配列に、新しいオブジェクトを格納することもできます。
1637
+  配列の要素の1つを別のオブジェクトと置き換えるには、
1638
+ </p>
1639
+
1640
+ <p>
1641
+ 配列名[インデックス] = 格納したいオブジェクト
1642
+ </p>
1643
+
1644
+ <p>
1645
+ という構文を使います。先ほどの配列namesを使ってみましょう。先頭に"野尻"という文字列を格納するには、
1646
+ </p>
1647
+
1648
+ <p>
1649
+ names<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup> = "野尻"
1650
+ </p>
1651
+
1652
+ <p>
1653
+ と書きます。例えば、次のように実行すると、namesの最初の要素が「野尻」になることがわかります。
1654
+ </p>
1655
+
1656
+ <p>
1657
+ 実行例
1658
+ </p>
1659
+
1660
+ <p>
1661
+ &gt; irb &#x2013;simple-prompt
1662
+ &gt;&gt; names = ["小林", "林", "高野", "森岡"]
1663
+ =&gt; ["小林", "林", "高野", "森岡"]
1664
+ &gt;&gt; names<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup> = "野尻"
1665
+ =&gt; "野尻"
1666
+ &gt;&gt; names
1667
+ =&gt; ["野尻", "林", "高野", "森岡"]
1668
+ </p>
1669
+
1670
+ <p>
1671
+  オブジェクトの格納先として、オブジェクトのまだ存在しない位置を指定すると、配列の大きさが変わります。Rubyの配列は、必要に応じて自動的に大きくなります。
1672
+ </p>
1673
+
1674
+ <p>
1675
+ 実行例
1676
+ </p>
1677
+
1678
+ <p>
1679
+ &gt; irb &#x2013;simple-prompt
1680
+ &gt;&gt; names = ["小林", "林", "高野", "森岡"]
1681
+ =&gt; ["小林", "林", "高野", "森岡"]
1682
+ &gt;&gt; name<sup><a id="fnr.5" name="fnr.5" class="footref" href="#fn.5">5</a></sup> = "野尻"
1683
+ =&gt; "野尻"
1684
+ &gt;&gt; names
1685
+ =&gt; ["小林", "林", "高野", "森岡", "野尻"]
1686
+ </p>
1687
+ </div>
1688
+ </div>
1689
+
1690
+ <div id="outline-container-sec-2-2-6" class="outline-4">
1691
+ <h4 id="sec-2-2-6">2.1.5. 配列の中身</h4>
1692
+ <div class="outline-text-4" id="text-2-2-6">
1693
+ <p>
1694
+  配列の中には、どんなオブジェクトも要素として格納できます。例えば、文字列ではなく数値の配列も作れます。
1695
+ </p>
1696
+
1697
+ <p>
1698
+ num = [3, 1, 4, 1, 5, 9, 2, 6, 5]
1699
+ </p>
1700
+
1701
+ <p>
1702
+  1つの配列の中に、複数の種類のオブジェクトを混ぜることもできます。
1703
+ </p>
1704
+
1705
+ <p>
1706
+ mixed = [1, "歌", 2, "風", 3]
1707
+ </p>
1708
+
1709
+ <p>
1710
+  ここでは例を挙げませんが、「時刻」や「ファイル」といったオブジェクトも、配列の要素にできます。
1711
+ </p>
1712
+ </div>
1713
+ </div>
1714
+
1715
+ <div id="outline-container-sec-2-2-7" class="outline-4">
1716
+ <h4 id="sec-2-2-7">2.1.6. 配列と大きさ</h4>
1717
+ <div class="outline-text-4" id="text-2-2-7">
1718
+ <p>
1719
+  配列の大きさを得るには、sizeメソッドを使います。例えば、配列arrayに対して次のように使います。
1720
+ </p>
1721
+
1722
+ <p>
1723
+ array.size
1724
+ </p>
1725
+
1726
+ <p>
1727
+  sizeメソッドを使って、先ほどの配列オブジェクトnamesの大きさを調べてみましょう。
1728
+ </p>
1729
+
1730
+ <p>
1731
+ 実行例
1732
+ </p>
1733
+
1734
+ <p>
1735
+ &gt; irb &#x2013;simple-prompt
1736
+ &gt;&gt; names = ["小林", "林", "高野", "森岡"]
1737
+ =&gt; ["小林", "林", "高野", "森岡"]
1738
+ &gt;&gt; names.size
1739
+ =&gt; 4
1740
+ </p>
1741
+
1742
+ <p>
1743
+  このように、配列の大きさが、数値として返ってきます。
1744
+ </p>
1745
+ </div>
1746
+ </div>
1747
+
1748
+ <div id="outline-container-sec-2-2-8" class="outline-4">
1749
+ <h4 id="sec-2-2-8">2.1.7. 配列と繰り返し</h4>
1750
+ <div class="outline-text-4" id="text-2-2-8">
1751
+ <p>
1752
+ 「配列の要素をすべて表示したい」とか、「配列の要素のうち、ある条件に当てはまる要素についてはxxメソッドを、当てはまらない要素についてはyyメソッドを適用したい」といったときには、配列の要素すべてにアクセスする方法が必要です。
1753
+  Rubyには、このためのメソッドとして、eachメソッドが用意されています。eachメソッドは、第1章でも少し触れたように「イテレータ」というメソッドの1つです。
1754
+  eachメソッドは、次のように使います。
1755
+ </p>
1756
+
1757
+ <p>
1758
+ 配列.each do |変数|
1759
+ 繰り返したい処理
1760
+ end
1761
+ </p>
1762
+
1763
+ <p>
1764
+  eachのすぐ後ろの「do ~ end」で囲まれている部分をブロックといいます。そのため、eachのようなメソッドは、ブロックつきメソッドとも呼ばれます。ブロックにはいくつかの処理をまとめて記述することができます。
1765
+  ブロックの冒頭には「|変数|」という部分があります。eachメソッドは、配列から要素を1つずつ取り出して、「|変数|」で指定された変数に代入して、ブロックの中のメソッドを繰り返し実行していきます。
1766
+  実際に使ってみましょう。配列namesにあるすべての要素を順番に表示してみます。
1767
+ </p>
1768
+
1769
+ <p>
1770
+ 実行例
1771
+ </p>
1772
+
1773
+ <p>
1774
+ &gt; irb &#x2013;simple-prompt
1775
+ &gt;&gt; names = ["小林", "林", "高野", "森岡"]
1776
+ =&gt; ["小林", "林", "高野", "森岡"]
1777
+ &gt;&gt; names.each do |n| # do~endのように複数行にまたがる場合、
1778
+ ?&gt; puts n endが入力されるまで実行されません
1779
+ &gt;&gt; end
1780
+ 小林 # putsメソッドの実行結果
1781
+
1782
+ 高野
1783
+ 森岡
1784
+ =&gt; ["小林", "林", "高野", "森岡"]  # eachメソッドの戻り値
1785
+ </p>
1786
+
1787
+ <p>
1788
+  |n|となっている部分の変数nには、繰り返しの度に配列namesの要素が代入されます。
1789
+ </p>
1790
+
1791
+
1792
+ <p>
1793
+  配列にはeachメソッドの他にもブロックを使うメソッドがたくさん用意されています。配列の要素をまとめて処理する場合によく使います。詳しくは「13.6 配列の主なメソッド」で取り上げます。
1794
+ </p>
1795
+ </div>
1796
+ </div>
1797
+ </div>
1798
+
1799
+ <div id="outline-container-sec-2-3" class="outline-3">
1800
+ <h3 id="sec-2-3"><span class="section-number-3">2.3</span> ハッシュ(Hash)</h3>
1801
+ <div class="outline-text-3" id="text-2-3">
1802
+ <p>
1803
+  ハッシュ(Hash)もよく使われるコンテナです。ハッシュでは文字列やシンボルなどをキーにしてオブジェクトを格納します。
1804
+ </p>
1805
+
1806
+ <p>
1807
+ address = {name: "高橋"m furigana: "タカハシ", postal: "1234567"}
1808
+ </p>
1809
+ </div>
1810
+
1811
+ <div id="outline-container-sec-2-3-1" class="outline-4">
1812
+ <h4 id="sec-2-3-1">2.2.1. シンボルとは</h4>
1813
+ <div class="outline-text-4" id="text-2-3-1">
1814
+ <p>
1815
+  シンボル(Symbol)というのは、文字列に似たオブジェクトで、Rubyがメソッドなどの名前を識別するためのラベルをオブジェクトにしたものです。
1816
+  シンボルは、先頭に「:」をつけて表現します。
1817
+ </p>
1818
+
1819
+ <p>
1820
+ sym = :foo # これがシンボル「:foo」を表す
1821
+ sym2 = :"foo" # 上と同じ意味
1822
+ </p>
1823
+
1824
+ <p>
1825
+  シンボルと同様のことは大抵文字列でもできます。ハッシュのキーのように単純に「同じかどうか」を比較するような場合は、文字列よりも効率が良いことが多いので、シンボルがよく使われます。
1826
+ </p>
1827
+
1828
+ <p>
1829
+  なお、シンボルと文字列はそれぞれ互いに変換できます。シンボルにto_sメソッドを使えば、対応する文字列を取り出せます。逆に、文字列にto_symメソッドを使えば、対応するシンボルを得られます。
1830
+ </p>
1831
+
1832
+ <p>
1833
+ 実行例
1834
+ </p>
1835
+
1836
+ <p>
1837
+ &gt; irb &#x2013;simple-prompt
1838
+ &gt;&gt; sym = :foo
1839
+ =&gt; :foo
1840
+ &gt;&gt; sum.to_s # シンボルを文字列に変換
1841
+ =&gt; "foo"
1842
+ &gt;&gt; "foo".to_sym # 文字列をシンボルに変換
1843
+ =&gt; :foo
1844
+ </p>
1845
+ </div>
1846
+ </div>
1847
+
1848
+
1849
+ <div id="outline-container-sec-2-3-2" class="outline-4">
1850
+ <h4 id="sec-2-3-2">2.2.2. ハッシュを作る</h4>
1851
+ <div class="outline-text-4" id="text-2-3-2">
1852
+ <p>
1853
+  新しいハッシュの作り方は、配列の作り方にちょっと似ています。配列と違うのは、「[]」の代わりに「{}」で囲むところです。また、ハッシュでは、オブジェクトを取り出すためのキーと、そのキーと対応させるオブジェクトを「キー =&gt; オブジェクト」という形式で指定します。キーにはシンボル、文字列、数理がよく使われます。
1854
+ </p>
1855
+
1856
+ <p>
1857
+ song = { :title =&gt; "Paranoid Android", :artist =&gt; "Radiohead" }
1858
+ person = { "名前" =&gt; "高橋", "仮名" =&gt; "タカハシ" }
1859
+ mark = { 11 =&gt; "Jack", 12 =&gt; "Queen", 13 =&gt; "King" }
1860
+ </p>
1861
+
1862
+ <p>
1863
+  とりわけシンボルがよく用いられるため、専用の短い書き方が用意されています。次の2つは同じ意味です。
1864
+ </p>
1865
+
1866
+ <p>
1867
+ person1 = { :name =&gt; "後藤", :kana =&gt; "ゴトウ" }
1868
+ person2 = { name: "後藤", kana: "ゴトウ" }
1869
+ </p>
1870
+ </div>
1871
+ </div>
1872
+
1873
+ <div id="outline-container-sec-2-3-3" class="outline-4">
1874
+ <h4 id="sec-2-3-3">2.2.3. ハッシュの操作</h4>
1875
+ <div class="outline-text-4" id="text-2-3-3">
1876
+ <p>
1877
+  ハッシュからオブジェクトを取り出したり、オブジェクトを格納したりする方法も、配列にそっくりです。ハッシュに格納されたオブジェクトを取り出すには、次の構文を使います。
1878
+ </p>
1879
+
1880
+ <p>
1881
+ ハッシュ名[キー]
1882
+ </p>
1883
+
1884
+ <p>
1885
+  また、オブジェクトを格納するには次の構文を使います。
1886
+ </p>
1887
+
1888
+ <p>
1889
+ ハッシュ名[キー] = 格納したいオブジェクト
1890
+ </p>
1891
+
1892
+ <p>
1893
+  配列と違って、キーには数値以外のオブジェクトも使えます。シンボルをキーにしたハッシュを操作してみましょう。
1894
+ </p>
1895
+
1896
+ <p>
1897
+ 実行例
1898
+ </p>
1899
+
1900
+ <p>
1901
+ &gt; irb &#x2013;simple-prompt
1902
+ &gt;&gt; address = {name: "高橋", furigana: "タカハシ"}
1903
+ =&gt; {:name=&gt;"高橋", :furigana=&gt;"タカハシ"}
1904
+ &gt;&gt; address{:name}
1905
+ =&gt; "高橋"
1906
+ &gt;&gt; address{:furigana}
1907
+ =&gt; "タカハシ"
1908
+ &gt;&gt; address{:tel} = "000-1234-5678"
1909
+ =&gt; "000-1234-5678"
1910
+ &gt;&gt; address
1911
+ =&gt; {:name=&gt;"高橋", :furigana=&gt;"タカハシ", :tel=&gt;"000-1234-5678"}
1912
+ </p>
1913
+ </div>
1914
+ </div>
1915
+
1916
+ <div id="outline-container-sec-2-3-4" class="outline-4">
1917
+ <h4 id="sec-2-3-4">2.2.4. ハッシュの繰り返し</h4>
1918
+ <div class="outline-text-4" id="text-2-3-4">
1919
+ <p>
1920
+  eachメソッドを使って、ハッシュのキーと値を1つずつ取り出し、すべての要素を処理することができます。配列の場合はインデックスの順に要素を取り出しましたが、ハッシュの場合は「キー」と「値」の組を取り出すことになります。
1921
+  ハッシュ用のeachは次のように書きます。
1922
+ </p>
1923
+
1924
+ <p>
1925
+ ハッシュ.each do |キーの変数, 値の変数|
1926
+ 繰り返したい処理
1927
+ end
1928
+ </p>
1929
+
1930
+ <p>
1931
+ 早速使ってみましょう。
1932
+ </p>
1933
+
1934
+ <p>
1935
+ 実行例
1936
+ </p>
1937
+
1938
+ <p>
1939
+ &gt; irb &#x2013;simple-prompt
1940
+ &gt;&gt; address = {name: = "高橋", furigana: "タカハシ"}
1941
+ =&gt; {:name=&gt;"高橋", :furigana=&gt;"タカハシ"}
1942
+ &gt;&gt; address.each do |key, value|
1943
+ ?&gt; puts "#{key}: #{value}"
1944
+ &gt;&gt; end
1945
+ name: 高橋
1946
+ furigana: タカハシ
1947
+ =&gt; {:name=&gt;"高橋", :furigana=&gt;"タカハシ"}
1948
+ </p>
1949
+
1950
+ <p>
1951
+  eachメソッドによって、ハッシュaddressが持っている項目名とその値を表示するputsメソッドが繰り返し実行されるのがわかります。
1952
+ </p>
1953
+ </div>
1954
+ </div>
1955
+ </div>
1956
+
1957
+ <div id="outline-container-sec-2-4" class="outline-3">
1958
+ <h3 id="sec-2-4"><span class="section-number-3">2.4</span> 正規表現</h3>
1959
+ <div class="outline-text-3" id="text-2-4">
1960
+ <p>
1961
+  Rubyで文字列を処理するときには、正規表現(Regular Expression)というものがよく使われます。正規表現を使うと、
1962
+ </p>
1963
+
1964
+ <p>
1965
+ ・文字列とパターンの一致(マッチング)
1966
+ ・パターンを使った文字列の切り出し
1967
+ </p>
1968
+
1969
+ <p>
1970
+ などを手軽に行えます。
1971
+  正規表現は、PerlやPythonなど、Rubyの先輩格にあたるスクリプト言語で培われてきた機能です。Rubyもその流れを受け継いでいて、言語に組み込みの機能として、手軽に正規表現を扱えます。文字列処理はRubyの得意分野ですが、それはこの正規表現のおかげでもあります。
1972
+ </p>
1973
+ </div>
1974
+
1975
+ <div id="outline-container-sec-2-4-1" class="outline-4">
1976
+ <h4 id="sec-2-4-1">2.3.1. パターンとマッチング</h4>
1977
+ <div class="outline-text-4" id="text-2-4-1">
1978
+ <p>
1979
+ 「〇〇という文字列を含んだ行を表示したい」とか、「〇〇と××の間に書かれた文字列を抜き出したい」などといった、特定の文字列のパターンに対する処理を行いたい場合があります。文字列がパターンに当てはまるかどうかを調べることをマッチングといい、パターンに当てはまることを「マッチする」といいます。
1980
+  このような文字列のパターンをプログラミング言語で表現するために使われるのが、正規表現です。
1981
+ </p>
1982
+
1983
+ <p>
1984
+ マッチングの例
1985
+ </p>
1986
+
1987
+ <p>
1988
+ <i>cde</i> =~ "abcdefg"
1989
+ </p>
1990
+
1991
+
1992
+ <p>
1993
+ 「正規表現」という言葉から、何やら難しげな雰囲気が漂う、硬そうな印象を持たれるかもしれません。実際のところ正規表現の世界は何かと奥が深いのですが、単純なマッチングに使う分にはあまり身構える必要はありません。まずは、そういうものがあるということを覚えておいてください。
1994
+  正規表現オブジェクトを作るための構文は、次の通りです。
1995
+ </p>
1996
+
1997
+ <p>
1998
+ <i>パターン</i>
1999
+ </p>
2000
+
2001
+ <p>
2002
+  例えば「Ruby」という文字列にマッチする正規表現は、
2003
+ </p>
2004
+
2005
+ <p>
2006
+ <i>Ruby</i>
2007
+ </p>
2008
+
2009
+ <p>
2010
+ と書きます。そのままですね。アルファベットと数字からなる文字列に一致するパターンを書く分には、「そのまま」で大丈夫です。
2011
+  正規表現と文字列のマッチングを行うためには、「=~」演算子を使います。同じオブジェクト同士が等しいかどうかを調べる「==」に似ています。
2012
+  正規表現と文字列のマッチングを行うには、
2013
+ </p>
2014
+
2015
+ <p>
2016
+ <i>パターン</i> =~ マッチングしたい文字列
2017
+ </p>
2018
+
2019
+ <p>
2020
+ と書きます。英数字や漢字だけのパターンを使った場合は、パターンの文字列を含んでいればマッチし、含んでいなければマッチしません。マッチングが成功した時は、マッチ部分の位置を返します。文字の位置は、配列のインデックスと同様に、0から数えます。つまり、先頭文字の位置は0と表されます。一方、マッチングが失敗だとnilを返します。
2021
+ </p>
2022
+
2023
+ <p>
2024
+ 実行例
2025
+ </p>
2026
+
2027
+ <p>
2028
+ &gt; irb &#x2013;simple-prompt
2029
+ &gt;&gt; <i>Ruby</i> =~ "Yet Another Ruby Hacker,"
2030
+ =&gt; 12
2031
+ &gt;&gt; <i>Ruby</i> =~ "Ruby"
2032
+ =&gt; 0
2033
+ &gt;&gt; <i>Ruby</i> =~ "Diamond"
2034
+ =&gt;nil
2035
+ </p>
2036
+
2037
+ <p>
2038
+  正規表現の右側の「/」に続けて「i」とかいた場合には、英字の大文字・小文字を区別せずにマッチングを行うようになります。
2039
+ </p>
2040
+
2041
+ <p>
2042
+ 実行例
2043
+ </p>
2044
+
2045
+ <p>
2046
+ &gt; irb &#x2013;simple-prompt
2047
+ &gt;&gt; <i>Ruby</i> =~ "ruby"
2048
+ =&gt; nil
2049
+ &gt;&gt; <i>Ruby</i> =~ "RUBY"
2050
+ =&gt; nil
2051
+ &gt;&gt; /Ruby/i =~ "ruby"
2052
+ =&gt; 0
2053
+ &gt;&gt; /Ruby/i =~ "RUBY"
2054
+ =&gt; 0
2055
+ &gt;&gt; /Ruby/i =~ "rUbY"
2056
+ =&gt; 0
2057
+ </p>
2058
+
2059
+ <p>
2060
+  これ以外にも、正規表現には数々の書き方や使い方があります。詳しくは「第16章 正規表現(Regexp)クラス」で説明します。
2061
+ </p>
2062
+ </div>
2063
+ </div>
2064
+
2065
+ <div id="outline-container-sec-2-4-2" class="outline-4">
2066
+ <h4 id="sec-2-4-2">コラム「nilとは?」</h4>
2067
+ <div class="outline-text-4" id="text-2-4-2">
2068
+ <p>
2069
+  nilはオブジェクトが存在しないことを表す特別な値です。正規表現によるマッチングの際に、どこにもマッチしなかったことを表す場合のように、メソッドが意味のある値を返すことができないときにはnilが返されます。また、配列やハッシュからデータを取り出す場合に、まだ存在していないインデックスやキーを指定すると次のようにnilが得られます。
2070
+ </p>
2071
+
2072
+ <p>
2073
+ 実行例
2074
+ </p>
2075
+
2076
+ <p>
2077
+ &gt; irb &#x2013;simple-prompt
2078
+ &gt;&gt; item = {"name"=&gt;"ブレンド", "price"=&gt;610}
2079
+ =&gt; {"name"=&gt;"ブレンド", "price"=&gt;610}
2080
+ &gt;&gt; item{"tax"}
2081
+ =&gt; nil
2082
+ </p>
2083
+
2084
+ <p>
2085
+  if文やwhile文は、条件を判定するときにfalseとnilを「偽」の値として扱い、それ以外の全ての値を「真」として扱います。したがって、trueかfalseのどちらかを返すメソッドだけではなく、「何らかの値」もしくは「nil」を返すメソッドも、条件として使うことができます。
2086
+  次の例は配列の中の「林」という文字を含む文字列だけを出力します。
2087
+ </p>
2088
+
2089
+ <p>
2090
+ List print_hayasi.rb
2091
+ </p>
2092
+
2093
+ <p>
2094
+ names = ["小林", "林", "高野", "森岡"]
2095
+ names.each do |name|
2096
+ if <i>林</i> =~ name
2097
+ puts name
2098
+ end
2099
+ end
2100
+ </p>
2101
+
2102
+ <p>
2103
+ 実行例
2104
+ </p>
2105
+
2106
+ <p>
2107
+ &gt; ruby print_hayasi.rb
2108
+ 小林
2109
+
2110
+ </p>
2111
+ </div>
2112
+ </div>
2113
+ </div>
2114
+ </div>
2115
+
2116
+
2117
+ <div id="outline-container-sec-3" class="outline-2">
2118
+ <h2 id="sec-3"><span class="section-number-2">3</span> コマンドを作ろう</h2>
2119
+ <div class="outline-text-2" id="text-3">
2120
+ </div><div id="outline-container-sec-3-1" class="outline-3">
2121
+ <h3 id="sec-3-1"><span class="section-number-3">3.1</span> イントロダクション</h3>
2122
+ <div class="outline-text-3" id="text-3-1">
2123
+ <p>
2124
+ この章では、コマンドラインからデータを受け取り、処理を行う方法を紹介します。また、第1部のまとめとして、Unixのgrepコマンドもどきを作成しましょう。Rubyプログラミングの大まかな流れをつかんでください。
2125
+ </p>
2126
+ </div>
2127
+ </div>
2128
+
2129
+ <div id="outline-container-sec-3-2" class="outline-3">
2130
+ <h3 id="sec-3-2"><span class="section-number-3">3.2</span> コマンドラインからのデータの入力</h3>
2131
+ <div class="outline-text-3" id="text-3-2">
2132
+ <p>
2133
+ 今まで行ってきたことは、データを画面に出力することでした。「出力」があればその反対、「入力」も試してみたくなります。そもそも、普通に使えるコマンドを作るにはプログラムに動作を指示する方法を知らなければいけません。そこで、Rubyのプログラムにデータを入力してみましょう。
2134
+ </p>
2135
+
2136
+ <p>
2137
+ プログラムにデータを与えるには、コマンドラインを利用する方法が一番簡単です。コマンドラインの情報をデータとして受け取るには「ARGV」という配列オブジェクトを使います。このARGVという配列は、コマンドラインからスクリプトの引数として与えられた文字列を要素として持っています。
2138
+ </p>
2139
+
2140
+ <p>
2141
+ List3.1で確認してみましょう。コマンドラインでスクリプトに引数を指定するときは、1つずつ空白で区切って入力してください。
2142
+ </p>
2143
+
2144
+ <div class="org-src-container">
2145
+
2146
+ <pre class="src src-ruby"># List3.1 print_argv.rb
2147
+ puts "最初の引数: #{ARGV[0]}"
2148
+ puts "2番目の引数: #{ARGV[1]}"
2149
+ puts "3番目の引数: #{ARGV[2]}"
2150
+ puts "4番目の引数: #{ARGV[3]}"
2151
+ puts "5番目の引数: #{ARGV[4]}"
2152
+ </pre>
2153
+ </div>
2154
+
2155
+ <pre class="example">
2156
+ 実行例
2157
+ &gt; ruby print_argv.rb 1st 2nd 3rd 4th 5th
2158
+ 最初の引数: 1st
2159
+ 2番目の引数: 2nd
2160
+ 3番目の引数: 3rd
2161
+ 4番目の引数: 4th
2162
+ 5番目の引数: 5th
2163
+ </pre>
2164
+
2165
+ <p>
2166
+ 配列ARGVを使えば、
2167
+ データをプログラムの中にすべて書いておく必要は無くなります。
2168
+ 配列なので、要素を取り出して変数に代入することもできます。
2169
+ </p>
2170
+
2171
+
2172
+ <div class="org-src-container">
2173
+
2174
+ <pre class="src src-ruby"># List3.2 happy_birth.rb
2175
+ name = ARGV[0]
2176
+ print "Happy Birthday, ", name, "!\n"
2177
+ </pre>
2178
+ </div>
2179
+
2180
+ <pre class="example">
2181
+ 実行例
2182
+ &gt; ruby happy_birth.rb Ruby
2183
+ Happy Birthday, Ruby!
2184
+ </pre>
2185
+
2186
+ <p>
2187
+ 引数から取得したデータは文字列になっているので、
2188
+ これを計算に使うときは数値に変換する必要があります。
2189
+ 文字列を整数にするには、to_iメソッドを使います。
2190
+ </p>
2191
+
2192
+ <ul class="org-ul">
2193
+ <li>to_i は to integer(整数へ)
2194
+ </li>
2195
+ </ul>
2196
+
2197
+
2198
+ <p>
2199
+ List3.3 arg_arith.rb
2200
+ </p>
2201
+ <div class="org-src-container">
2202
+
2203
+ <pre class="src src-ruby">num0 = ARGV[0].to_i
2204
+ num1 = ARGV[1].to_i
2205
+ puts "#{num0} + #{num1} = #{num0 + num1}"
2206
+ puts "#{num0} - #{num1} = #{num0 - num1}"
2207
+ puts "#{num0} * #{num1} = #{num0 * num1}"
2208
+ puts "#{num0} / #{num1} = #{num0 / num1}"
2209
+ </pre>
2210
+ </div>
2211
+
2212
+ <p>
2213
+ 実行例
2214
+ </p>
2215
+
2216
+ <p>
2217
+ &gt; ruby arg_arith.rb 5 3
2218
+ 5 + 3 = 8
2219
+ 5 - 3 = 2
2220
+ 5 * 3 = 15
2221
+ 5 / 3 = 1
2222
+ </p>
2223
+ </div>
2224
+ </div>
2225
+
2226
+ <div id="outline-container-sec-3-3" class="outline-3">
2227
+ <h3 id="sec-3-3"><span class="section-number-3">3.3</span> ファイルからの読み込み</h3>
2228
+ <div class="outline-text-3" id="text-3-3">
2229
+ </div><div id="outline-container-sec-3-3-1" class="outline-4">
2230
+ <h4 id="sec-3-3-1">イントロダクション</h4>
2231
+ <div class="outline-text-4" id="text-3-3-1">
2232
+ <p>
2233
+  Rubyのスクリプトが入力として受け取れるデータは、コマンドライン引数だけではありません。ファイルからデータを読み込むこともできます。
2234
+  Rubyのソースコードには、「ChangeLog」というテキストファイルが付いています。これには、誰がどのようにRubyを変更したかが記してあります。
2235
+ </p>
2236
+
2237
+
2238
+ <p>
2239
+ *メモ Rubyのソースコードは、Rubyの公式ウェブサイトから入手できます。Changelogファイルは、GithubのRubyレポジトリからも取得可能です。
2240
+ </p>
2241
+
2242
+ <p>
2243
+ ・Rubyのソースコードダウンロード
2244
+  <a href="https://www.ruby-lang.org/ja/downloads/">https://www.ruby-lang.org/ja/downloads/</a>
2245
+ ・Github上のChangelogファイル
2246
+  <a href="https://raw.github.com/ruby/ruby/ruby_2_3/ChangeLog">https://raw.github.com/ruby/ruby/ruby_2_3/ChangeLog</a>
2247
+ </p>
2248
+
2249
+
2250
+ <p>
2251
+  このファイルを使って、Rubyでのファイル操作の練習をしてみましょう。
2252
+ </p>
2253
+ </div>
2254
+ </div>
2255
+
2256
+ <div id="outline-container-sec-3-3-2" class="outline-4">
2257
+ <h4 id="sec-3-3-2">3.2.1. ファイルからテキストデータを読み込んで表示する</h4>
2258
+ <div class="outline-text-4" id="text-3-3-2">
2259
+ <p>
2260
+  まず、単純にファイルの中身をすべて表示するプログラムを作ってみましょう。ファイルの中身を表示するプログラムは、次のような流れになります。
2261
+ </p>
2262
+
2263
+ <p>
2264
+ 1.ファイルを開く
2265
+ 2.ファイルのテキストデータを読み込む
2266
+ 3.読み込んだテキストデータを出力する
2267
+ 4.ファイルを閉じる
2268
+ </p>
2269
+
2270
+ <p>
2271
+  この流れを、そのままプログラムにしてみましょう。(List3.4)
2272
+ </p>
2273
+
2274
+ <p>
2275
+ List3.4 read_text.rb
2276
+ </p>
2277
+
2278
+ <div class="org-src-container">
2279
+
2280
+ <pre class="src src-ruby">filename = ARGV[0]
2281
+ file = File.open(filename) # 1.
2282
+ text = file.read # 2.
2283
+ print text # 3.
2284
+ file.close # 4.
2285
+ </pre>
2286
+ </div>
2287
+
2288
+ <p>
2289
+  今までの例に比べると、ちょっとプログラムらしくなってきました。1行ずつ説明します。
2290
+  1行目では、filenameという変数にコマンドラインから受け取った最初の引数の値ARGV<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup>を代入しています。つまり、変数filenameは読み出したいファイルの名前を示していることになります。
2291
+  2行目で使っている「File.open(filename)」は、filenameという名前のファイルを開き、そのファイルを読み込むためのオブジェクトを返します。
2292
+ ……と言われても、「ファイルを読み込むためのオブジェクト」というのが何を意味しているのかよくわからないという方もいるかもしれません。あまり気にせず、ここではそういうオブジェクトがあるとだけ思ってください。詳しくは「第17章 IOクラス」で説明します。
2293
+  この「ファイルを読み込むためのオブジェクト」が実際に使われるのは3行目です。ここでは、「read」というメソッドでデータを読み込み、その結果をtextに代入しています。ここでtextに代入されたテキストデータが、4行目で出力されます。printメソッドは今までにも何度も使ってきたので、もうすっかりおなじみのことでしょう。そして、最後に「close」というメソッドを実行します。これは、開いたファイルを閉じるためのメソッドです。
2294
+  このプログラムを次のように実行すると、指定したファイルの内容をそのまま一気に表示します。
2295
+ </p>
2296
+
2297
+ <p>
2298
+ &gt; ruby read_text.rb 表示したいファイル名
2299
+ </p>
2300
+
2301
+ <p>
2302
+  もっとも、ファイルを読み込むだけであれば、File.readメソッドを使うともっと簡単に書けます。(List3.5)
2303
+ </p>
2304
+
2305
+ <p>
2306
+ List3.5 read_text_simple.rb
2307
+ </p>
2308
+ <div class="org-src-container">
2309
+
2310
+ <pre class="src src-ruby">filename = ARGV[0]
2311
+ text = File.read(filename)
2312
+ print text
2313
+ </pre>
2314
+ </div>
2315
+
2316
+ <p>
2317
+  File.readメソッドについても詳しくは「第17章 IOクラス」で説明します。
2318
+  さらに、変数が不要であれば、1行でも書けます。(List3.6)
2319
+ </p>
2320
+
2321
+ <p>
2322
+ List3.6 read_text_oneline.rb
2323
+ </p>
2324
+ <div class="org-src-container">
2325
+
2326
+ <pre class="src src-ruby">print File.read(ARGV[0])
2327
+ </pre>
2328
+ </div>
2329
+ </div>
2330
+ </div>
2331
+
2332
+ <div id="outline-container-sec-3-3-3" class="outline-4">
2333
+ <h4 id="sec-3-3-3">3.2.2. ファイルからテキストデータを1行ずつ読み込んで表示する</h4>
2334
+ <div class="outline-text-4" id="text-3-3-3">
2335
+ <p>
2336
+  ここまでで、まとめて読み込んだテキストデータを表示することができるようになりました。しかし、先ほどの方法では、
2337
+ </p>
2338
+
2339
+ <p>
2340
+ ・ファイルのデータをまとめて読み込むのに時間がかかる
2341
+ ・一時的にすべてのデータをメモリに貯めることになるので、大きなファイルの場合に困ることがある
2342
+ </p>
2343
+
2344
+ <p>
2345
+ といった問題があります。
2346
+  100万行あるようなファイルでも、本当に必要なのは最初の数行だけ、ということもあります。そのような場合、すべてのファイルを読み込むまで何もしない、というのは、時間とメモリを無駄に使ってしまうことになります。
2347
+  このような問題を解決するには、データを全て読み込んでから処理を開始するというアプローチをやめる必要があります。
2348
+ </p>
2349
+
2350
+ <p>
2351
+ ・データをすべて読み込んでから処理する
2352
+   ー>ファイル全体を収めるメモリ空間が必要
2353
+ </p>
2354
+
2355
+ <p>
2356
+ ・一行ずつ読み込んで処理する
2357
+   ー>メモリ空間は一行分でよい
2358
+ </p>
2359
+
2360
+ <p>
2361
+ List3.7 read_line.rb
2362
+ </p>
2363
+ <div class="org-src-container">
2364
+
2365
+ <pre class="src src-ruby">filename = ARGV[0]
2366
+ file = File.open(filename)
2367
+ file.each_line do |line|
2368
+ print line
2369
+ end
2370
+ file.close
2371
+ </pre>
2372
+ </div>
2373
+
2374
+ <p>
2375
+  1、2行目は、List3.4と同じです。3行目以降がちょっと変わっています。3行目から5行目はeach_lineメソッドを使っています。
2376
+  each_lineメソッドは、第2章で紹介したeachメソッドに似たメソッドです。eachメソッドは配列の各要素をそれぞれ処理するメソッドでしたが、each_lineメソッドはファイルの各行をそれぞれ処理するメソッドです。ここではファイルを一行ずつ読み込み、その行の文字列lineをprintメソッドで出力することで、最終的にすべての行が出力されています。
2377
+ </p>
2378
+ </div>
2379
+ </div>
2380
+
2381
+ <div id="outline-container-sec-3-3-4" class="outline-4">
2382
+ <h4 id="sec-3-3-4">3.2.3. ファイルの中から特定のパターンの行のみを選んで出力する</h4>
2383
+ <div class="outline-text-4" id="text-3-3-4">
2384
+ <p>
2385
+  Unixには、grepというコマンドがあります。これは、入力されたテキストデータの中から、正規表現で指定した特定のパターンにマッチする行を出力するコマンドです。これに似たコマンドを作ってみましょう。(List3.8)
2386
+ </p>
2387
+
2388
+ <p>
2389
+ List3.8 simple_grep.rb
2390
+ </p>
2391
+ <div class="org-src-container">
2392
+
2393
+ <pre class="src src-ruby">pattern = Regexp.new(ARGV[0])
2394
+ filename = ARGV[1]
2395
+
2396
+ file = File.open(filename)
2397
+ file.each_line do |line|
2398
+ if pattern =~ line
2399
+ print line
2400
+ end
2401
+ end
2402
+ file.close
2403
+ </pre>
2404
+ </div>
2405
+
2406
+ <p>
2407
+  List3.8を実行するには、次のように入力します。
2408
+ </p>
2409
+
2410
+ <p>
2411
+ &gt; ruby simple_grep.rb パターン ファイル名
2412
+ </p>
2413
+
2414
+ <p>
2415
+  少し長くなったので、一行ずつ見ていきましょう。
2416
+  Rubyを実行する際にコマンドラインで与えた引数は、ARGV<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup>とARGV<sup><a id="fnr.2.100" name="fnr.2.100" class="footref" href="#fn.2">2</a></sup>に代入されます。1行目では、1つ目の引数ARGV<sup><a id="fnr.1.100" name="fnr.1.100" class="footref" href="#fn.1">1</a></sup>を元に正規表現オブジェクトを作り、変数patternに代入します。「Regexp.nre(str)」という形で、引数の文字列strから正規表現オブジェクトを作ります。そして2行目では、2つ目の引数ARGV<sup><a id="fnr.2.100" name="fnr.2.100" class="footref" href="#fn.2">2</a></sup>をファイル名に使う変数filenameに代入します。
2417
+  4行目では、ファイルを開き、ファイルオブジェクトを作り、これを変数Fileに代入します。
2418
+  5行目はList3.7と同じです。1行ずつ読み込んで変数lineに代入し、8行目までを繰り返します。
2419
+  6行目はif文になっています。ここで、変数lineの値である文字列が変数patternの値である正規表現にマッチするかどうか調べます。マッチした場合、7行目のprintメソッドでその文字列を出力します。このif文にはelse節がないので、マッチしなかった場合は何も起こりません。
2420
+  すべてのテキストの読み込みが終わったらファイルを閉じて終了します。たとえば、ファイルChangelogから「matz」という文字列が含まれている行を出力したい場合には、次のように実行します。
2421
+ </p>
2422
+
2423
+ <p>
2424
+ &gt; ruby simple_grep.rb matz Changelog
2425
+ </p>
2426
+
2427
+ <p>
2428
+ 「matz」とは、まつもとゆきひろ氏のニックネームです。まつもとゆきひろ氏による変更の履歴が出力されます。
2429
+ </p>
2430
+ </div>
2431
+ </div>
2432
+ </div>
2433
+
2434
+ <div id="outline-container-sec-3-4" class="outline-3">
2435
+ <h3 id="sec-3-4"><span class="section-number-3">3.4</span> メソッドの作成</h3>
2436
+ <div class="outline-text-3" id="text-3-4">
2437
+ <p>
2438
+  今までいくつかのメソッドを使ってきましたが、自分で作ることもできます。メソッドを作成する構文は次のようになります。
2439
+ </p>
2440
+
2441
+ <p>
2442
+ def メソッド名
2443
+ メソッドで実行したい処理
2444
+ end
2445
+ </p>
2446
+
2447
+ <p>
2448
+ 「Hello, Ruby.」と表示するメソッドを作ってみましょう。
2449
+ </p>
2450
+
2451
+ <p>
2452
+ def hello
2453
+ puts "Hello, Ruby."
2454
+ end
2455
+ </p>
2456
+
2457
+ <p>
2458
+  この三行だけを書いたプログラムを実行しても、何も起こりません。helloメソッドが呼び出される前に、プログラムが終わってしまっているからです。そのため、自分で作成したメソッドを実行するコードも必要になります。
2459
+ </p>
2460
+
2461
+ <p>
2462
+ List3.9 hello_ruby2.rb
2463
+ </p>
2464
+ <div class="org-src-container">
2465
+
2466
+ <pre class="src src-ruby">def hello
2467
+ puts "Hello, Ruby."
2468
+ end
2469
+
2470
+ hello()
2471
+ </pre>
2472
+ </div>
2473
+
2474
+ <p>
2475
+ 実行例
2476
+ </p>
2477
+
2478
+ <p>
2479
+ &gt; ruby hello_ruby2.rb
2480
+ hello, Ruby.
2481
+ </p>
2482
+
2483
+ <p>
2484
+ 「hello()」というメソッド呼び出しにより、1~3行目で定義されたhelloメソッドが実行されます。
2485
+ </p>
2486
+ </div>
2487
+ </div>
2488
+
2489
+ <div id="outline-container-sec-3-5" class="outline-3">
2490
+ <h3 id="sec-3-5"><span class="section-number-3">3.5</span> 別のファイルを取り込む</h3>
2491
+ <div class="outline-text-3" id="text-3-5">
2492
+ <p>
2493
+  プログラムの一部を、別の新しいプログラムの中で使いまわしたいことがあります。たとえば、あるプログラムで使った自作メソッドを、別のプログラムで利用したい、と言った場合です。
2494
+  たいていのプログラミング言語では、別々のファイルに分割されたプログラムを組み合わせて、1つのプログラムとして利用するための機能を持っています。他のプログラムから読み込んで利用するためのプログラムを、ライブラリといいます。
2495
+  プログラムの中でライブラリを読み込むには、requireメソッドまたはrequire_relativeメソッドを使います。
2496
+ </p>
2497
+
2498
+ <p>
2499
+ require 使いたいライブラリのファイル名
2500
+ </p>
2501
+
2502
+ <p>
2503
+ または、
2504
+ </p>
2505
+
2506
+ <p>
2507
+ require_relative 使いたいライブラリのファイル名
2508
+ </p>
2509
+
2510
+ <p>
2511
+  使いたいライブラリのファイル名の「.rb」は省略することができます。
2512
+  requireメソッドを呼ぶと、Rubyは引数に指定されたライブラリを探して、そのファイルに書かれた内容を読み込みます。ライブラリの読み込みが終わると再び、requireメソッドの次の行から処理を再開します。
2513
+ </p>
2514
+
2515
+ <p>
2516
+  requireメソッドは既存のライブラリを読み込むときに使います。ライブラリ名を指定するだけで、Rubyと一緒にインストールされたライブラリなど、あらかじめ決められた場所から探し出して読み込んでくれます。それに対してrequire_relativeメソッドは、実行するプログラムは置かれたディレクトリ(フォルダ)を基準にしてライブラリを探します。複数のファイルに分けて記述したプログラムを読み込むときに便利です。
2517
+  実際の例として、先ほどのsimple_grep.rbの検索部分をライブラリとして、他のプログラムから使ってみましょう。ライブラリといっても別に変わった書き方は必要ありません。simple_grepメソッドを定義したファイル(List3.10)と、それを利用するプログラム(List3.11)を同じディレクトリに作成します。
2518
+ </p>
2519
+
2520
+ <p>
2521
+ List3.10 grep.rb
2522
+ </p>
2523
+ <div class="org-src-container">
2524
+
2525
+ <pre class="src src-ruby">def simple_grep(pattern, filename)
2526
+ file = File.open(filename)
2527
+ file.each_line do |line|
2528
+ if pattern =~ line
2529
+ print line
2530
+ end
2531
+ end
2532
+ file.close
2533
+ end
2534
+ </pre>
2535
+ </div>
2536
+
2537
+ <p>
2538
+ List3.11 use_grep.rb
2539
+ </p>
2540
+ <div class="org-src-container">
2541
+
2542
+ <pre class="src src-ruby">require_relative "grep"
2543
+
2544
+ pattern = Regexp.new(ARGV[0])
2545
+ filename = ARGV[1]
2546
+ simple+grep(pattern, filename)
2547
+ </pre>
2548
+ </div>
2549
+
2550
+ <p>
2551
+  simple_grepメソッドは検索するパターンとファイル名が必要なので、これらをpatternとfilenameという引数で受け取るようになっています。
2552
+  grep.rbで定義したsimple_grepメソッドを、use_grep.rbで呼び出していることに注目してください。List3.8の実行例と同様に、ファイルChangelogから「matz」という文字列が含まれている行を出力したい場合には、次のように実行します。
2553
+ </p>
2554
+
2555
+ <p>
2556
+ &gt; ruby use_grep.rb matz Changelog
2557
+ </p>
2558
+
2559
+ <p>
2560
+  Rubyには、たくさんの便利なライブラリが標準で付属しています。これらを利用する場合にrequireメソッドを使います。
2561
+  たとえば、dateライブラリを読み込むことで、今日の日付を求めるDate.todayメソッドや特定の日付のオブジェクトを生成するDate.newメソッドなどを利用できるようになります。Rubyの誕生日である1993年2月24日から今日までの日数を求めるプログラムは次のようになります。dateライブラリについては第20章で詳しく説明します。
2562
+ </p>
2563
+
2564
+ <div class="org-src-container">
2565
+
2566
+ <pre class="src src-ruby">require "date"
2567
+
2568
+ days = Date.today - Date.new(1993, 2, 24)
2569
+ puts(days.to_i)
2570
+ </pre>
2571
+ </div>
2572
+ </div>
2573
+
2574
+
2575
+ <div id="outline-container-sec-3-5-1" class="outline-4">
2576
+ <h4 id="sec-3-5-1">コラム「ppメソッド」</h4>
2577
+ <div class="outline-text-4" id="text-3-5-1">
2578
+ <p>
2579
+  pメソッドと同じような目的に使われるメソッドとして、ppメソッドがあります。ppは「Pretty Print」の略です。ppメソッドを利用するには、ppライブラリをrequireメソッドで読み込む必要があります。
2580
+ </p>
2581
+
2582
+ <p>
2583
+ List p_and_pp.rb
2584
+ </p>
2585
+ <div class="org-src-container">
2586
+
2587
+ <pre class="src src-ruby">require "pp"
2588
+
2589
+ books = [
2590
+ { title: "猫街", author: "荻原翔太郎" },
2591
+ { title: "猫の事務所", author: "宮沢賢治" },
2592
+ { title: "猫語の教科書", author: "ポール・ギャリコ" },
2593
+ ]
2594
+ p books
2595
+ pp books
2596
+ </pre>
2597
+ </div>
2598
+
2599
+ <p>
2600
+ 実行例
2601
+ </p>
2602
+
2603
+ <p>
2604
+ &gt; ruby p_and_pp.rb
2605
+ [{:title=&gt;"猫街", :author=&gt;"萩原翔太郎"}, {:title=&gt;"猫の事務所", :author=&gt;"宮沢賢治"}, {:title=&gt;"猫語の教科書", :author=&gt;"ポール・ギャリコ"}]
2606
+ [{:title=&gt;"猫街", :author=&gt;"萩原翔太郎"},
2607
+ {:title=&gt;"猫の事務所", :author=&gt;"宮沢賢治"},
2608
+ {:title=&gt;"猫語の教科書", :author=&gt;"ポール・ギャリコ"}]
2609
+ </p>
2610
+
2611
+ <p>
2612
+  pメソッドとは異なり、ppメソッドはオブジェクトの構造を表示する際に、適当に改行を補ってみやすく整形してくれます。ハッシュの配列のように、入れ子になったコンテナを確認する場合に利用すると良いでしょう。
2613
+ </p>
2614
+ </div>
2615
+ </div>
2616
+ </div>
2617
+ </div>
2618
+ <div id="footnotes">
2619
+ <h2 class="footnotes">Footnotes: </h2>
2620
+ <div id="text-footnotes">
2621
+
2622
+ <div class="footdef"><sup><a id="fn.1" name="fn.1" class="footnum" href="#fnr.1">1</a></sup> <p>DEFINITION NOT FOUND.</p></div>
2623
+
2624
+ <div class="footdef"><sup><a id="fn.2" name="fn.2" class="footnum" href="#fnr.2">2</a></sup> <p>DEFINITION NOT FOUND.</p></div>
2625
+
2626
+ <div class="footdef"><sup><a id="fn.3" name="fn.3" class="footnum" href="#fnr.3">3</a></sup> <p>DEFINITION NOT FOUND.</p></div>
2627
+
2628
+ <div class="footdef"><sup><a id="fn.4" name="fn.4" class="footnum" href="#fnr.4">4</a></sup> <p>DEFINITION NOT FOUND.</p></div>
2629
+
2630
+ <div class="footdef"><sup><a id="fn.5" name="fn.5" class="footnum" href="#fnr.5">5</a></sup> <p>DEFINITION NOT FOUND.</p></div>
2631
+
2632
+
2633
+ </div>
2634
+ </div></div>
2635
+ <div id="postamble" class="status">
2636
+ <p class="author">Author: Shun Takahashi</p>
2637
+ <p class="date">Created: 2018-08-02 木 14:55</p>
2638
+ <p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 25.3.1 (<a href="http://orgmode.org">Org</a> mode 8.2.10)</p>
2639
+ <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
2640
+ </div>
2641
+ </body>
2642
+ </html>