diff options
Diffstat (limited to 'public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html')
| -rw-r--r-- | public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html | 24 |
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 "Y" 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 'Hello, World!' 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' or ';' or '\n' if true puts 'Hello, World!' 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 'Hello, World!' end</code> </pre> @@ -147,7 +147,7 @@ puts 'Hello, World!' 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 'Hello, World!' 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 < 0 then b |
