From 98682c7a8792e7e79e487fea5024d25cee5aa310 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 15 Mar 2023 01:36:13 +0900 Subject: fix(nuldoc):
 contained unnecessary whitespaces inside it

---
 .../ruby-then-keyword-and-case-in/index.html       | 68 +++++++---------------
 1 file changed, 22 insertions(+), 46 deletions(-)

(limited to 'public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html')

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 9b1df47..ed8d9e8 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,20 +65,17 @@
               使われることは稀だが、Ruby ではthenがキーワードになっている。次のように使う:
             

-
-              if cond then
+            
if cond then
   puts "Y"
   else
   puts "N"
-  end
-            
+ end

このキーワードが現れうる場所はいくつかあり、ifunlessrescuecase構文がそれに当たる。 上記のように、何か条件を書いた後thenを置き、式がそこで終了していることを示すマーカーとして機能する。

-
-              # Example:
+            
# Example:
 
 if x then
 a
@@ -97,8 +94,7 @@ end
 case x
 when p then
 a
-end
-            
+end
@@ -107,21 +103,17 @@ end 普通 Ruby のコードでthenを書くことはない。なぜか。次のコードを実行してみるとわかる。

-
-              if true puts 'Hello, World!' end
-            
+
if true puts 'Hello, World!' end

次のような構文エラーが出力される。

-
-              20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n'
+            
20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n'
   if true puts 'Hello, World!' end
   ^~~~
   20:1: syntax error, unexpected `end', expecting end-of-input
-  ...f true puts 'Hello, World!' end
-            
+ ...f true puts 'Hello, World!' end

二つ目のメッセージは無視して一つ目を読むと、then;か改行が来るはずのところ変数だかメソッドだかが現れたことによりエラーとなっているようだ。 @@ -131,10 +123,8 @@ end ポイントは改行がthen(や;) の代わりとなることである。trueの後に改行を入れてみる。

-
-              if true
-puts 'Hello, World!' end
-            
+
if true
+puts 'Hello, World!' end

無事 Hello, World! と出力されるようになった。 @@ -147,27 +137,21 @@ puts 'Hello, World!' end なぜthen;や改行 (以下 「then等」) が必要なのだろうか。次の例を見てほしい:

-
-              if a b end
-            
+
if a b end

then;も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。 この例は二通りに解釈できる。

-
-              # a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
+            
# a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
 if a then
 b
-end
-            
+end
-
-              # a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
+            
# a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
 # その結果が truthy なら何もしない
 if a(b) then
-end
-            
+end

then等はこの曖昧性を排除するためにあり、条件式はifからthen等までの間にある、ということを明確にする。 C系のif後に来る(/)や、Python の:、Rust/Go/Swift などの{も同じ役割を持つ。 @@ -188,8 +172,7 @@ end https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986

-
-              p_case_body : keyword_in
+            
p_case_body : keyword_in
   {
   SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
   p->command_start = FALSE;
@@ -214,17 +197,14 @@ end
   /*% %*/
   /*% ripper: in!($4, $7, escape_Qundef($8)) %*/
   }
-  ;
-            
+ ;

簡略版:

-
-              p_case_body : keyword_in p_top_expr then compstmt p_cases
-;
-            
+
p_case_body : keyword_in p_top_expr then compstmt p_cases
+;

ここで、keyword_inは文字通りinp_top_exprはいわゆるパターン、thenthenキーワードのことではなく、この記事でthen等と呼んでいるもの、つまりthenキーワード、;、改行のいずれかである。 @@ -234,8 +214,7 @@ end これにより、case-whenによる従来の構文と同じように、then等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる:

-
-              case x
+            
case x
 in 1 then a
 in 2 then b
 in 3 then c
@@ -254,20 +233,17 @@ case x
 in 1; a
 in 2; b
 in 3; c
-end
-            
+end

ところで、p_top_exprにはifによる guard clause が書けるので、その場合はif-thenと似たような見た目になる。

-
-              case x
+            
case x
 in 0 then a
 in n if n < 0 then b
 in n then c
-end
-            
+end
-- cgit v1.2.3-70-g09d2