aboutsummaryrefslogtreecommitdiffhomepage
path: root/public/posts/2021-10-02/ruby-then-keyword-and-case-in
diff options
context:
space:
mode:
Diffstat (limited to 'public/posts/2021-10-02/ruby-then-keyword-and-case-in')
-rw-r--r--public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html24
1 files changed, 12 insertions, 12 deletions
diff --git a/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html b/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html
index 1def6b6..9b1df47 100644
--- a/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html
+++ b/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html
@@ -65,7 +65,7 @@
使われることは稀だが、Ruby では<code>then</code>がキーワードになっている。次のように使う:
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if cond then
puts &quot;Y&quot;
else
@@ -77,7 +77,7 @@
このキーワードが現れうる場所はいくつかあり、<code>if</code>、<code>unless</code>、<code>rescue</code>、<code>case</code>構文がそれに当たる。 上記のように、何か条件を書いた後<code>then</code>を置き、式がそこで終了していることを示すマーカーとして機能する。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code># Example:
if x then
@@ -107,7 +107,7 @@ end</code>
普通 Ruby のコードで<code>then</code>を書くことはない。なぜか。次のコードを実行してみるとわかる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if true puts &apos;Hello, World!&apos; end</code>
</pre>
@@ -115,7 +115,7 @@ end</code>
次のような構文エラーが出力される。
</p>
- <pre class="monospaced">
+ <pre class="monospaced highlight">
<code>20:1: syntax error, unexpected local variable or method, expecting `then&apos; or &apos;;&apos; or &apos;\n&apos;
if true puts &apos;Hello, World!&apos; end
^~~~
@@ -131,7 +131,7 @@ end</code>
ポイントは改行が<code>then</code>(や<code>;</code>) の代わりとなることである。<code>true</code>の後に改行を入れてみる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if true
puts &apos;Hello, World!&apos; end</code>
</pre>
@@ -147,7 +147,7 @@ puts &apos;Hello, World!&apos; end</code>
なぜ<code>then</code>や<code>;</code>や改行 (以下 「<code>then</code>等」) が必要なのだろうか。次の例を見てほしい:
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>if a b end</code>
</pre>
@@ -155,14 +155,14 @@ puts &apos;Hello, World!&apos; end</code>
<code>then</code>も<code>;</code>も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。 この例は二通りに解釈できる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code># a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
if a then
b
end</code>
</pre>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code># a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
# その結果が truthy なら何もしない
if a(b) then
@@ -188,7 +188,7 @@ end</code>
<a href="https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986">https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986</a>
</p>
- <pre language="yacc" linenumbering="unnumbered">
+ <pre class="highlight" language="yacc" linenumbering="unnumbered">
<code>p_case_body : keyword_in
{
SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
@@ -221,7 +221,7 @@ end</code>
簡略版:
</p>
- <pre language="yacc" linenumbering="unnumbered">
+ <pre class="highlight" language="yacc" linenumbering="unnumbered">
<code>p_case_body : keyword_in p_top_expr then compstmt p_cases
;</code>
</pre>
@@ -234,7 +234,7 @@ end</code>
これにより、<code>case</code>-<code>when</code>による従来の構文と同じように、<code>then</code>等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる:
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>case x
in 1 then a
in 2 then b
@@ -261,7 +261,7 @@ end</code>
ところで、<code>p_top_expr</code>には<code>if</code>による guard clause が書けるので、その場合は<code>if</code>-<code>then</code>と似たような見た目になる。
</p>
- <pre language="ruby" linenumbering="unnumbered">
+ <pre class="highlight" language="ruby" linenumbering="unnumbered">
<code>case x
in 0 then a
in n if n &lt; 0 then b