QA@IT
«回答へ戻る

記述を修正しました

5599
 
 > メソッドの引数としてのスペースや括弧が && と and の中間の優先度だということだと思うのですが
 
-スペースや括弧というよりはカンマの方が andよりも優先度が高いと考えるとシンプルかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。
+スペースや括弧というよりはカンマの方が and/orよりも優先度が高いからかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。
 
+引数が一つの場合は単に`sample(3 if true)` と似たような文法エラーという解釈でもいいじゃないでしょうかね。こちらは修飾子ですが `sample((3 if true))` は同じように成功します。
+
+
 rubyのドキュメントとしてそこまでの説明が存在するかどうかはわかりません(提示してくれていたリファレンスにある優先度しかないかもしれません)。
 
 なお、rubyの and と orは優先度が同一のようなので、 && や || とは別の特殊なものと捉えた方がいいと思います。
 # つまり以下は成り立たない。左はtrueで右はfalse。
 ( true || true && false) == (true or true and false)
 ```
-
 

どのような性質なため

と、言われると評価優先度が低いからなのですが、

and、or は優先度が低いので自分の左右を先に解決してもらおうとします。

1 * 2 + 3 * 4

と書くと掛け算が優先されるのと同じですね。

def sample(a)
  p !a
end

このような関数があった場合に

sample true and false

と書いた場合、これは

(sample true) and false
(sample true) && false

と同じ結果になります。

一方

sample true && false

とした場合は

sample (true and false)
sample (true && false)

と同じ結果になります。

andやorが優先度が相当に低く設定されているため、andやorを評価する前に周りを評価しようとします。 andやorよりも関数の評価を先に行おうとしますが、そうすると文法的におかしいためにエラーになってしまうため、明示的にandやorを先に評価させるために括弧を書くわけです。


余談ですが優先度と括弧は等価ではありませんので

sample(true and false)

は上の例で示したように

(sample(true) and (false))

と、andの左右にある塊を括弧で括っても結果は同じになりません。
(運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)

コメントを受けて追記しました

メソッドの sample(foo)sample fooが等価で二重括弧の一つ目は引数を表すための括弧で、もう一つがandを先に処理するための優先度変更のための括弧という理解であっているでしょうか?

その通りです。
ちなみに細かい話ですが
sample(foo)sample (foo) は異なる結果をもたらしますのでここも気を付けてください。

sample((true and false))
sample (true and false)

は等価です。二個目はメソッド名の次に空白がありますので、メソッドの引数を括る括弧は省略されたとみなされます。

sample(true and false)

はエラーです。括弧はメソッドの引数を括っているとみなされています。

メソッドの引数としてのスペースや括弧が && と and の中間の優先度だということだと思うのですが

スペースや括弧というよりはカンマの方が and/orよりも優先度が高いからかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。

引数が一つの場合は単にsample(3 if true) と似たような文法エラーという解釈でもいいじゃないでしょうかね。こちらは修飾子ですが sample((3 if true)) は同じように成功します。

rubyのドキュメントとしてそこまでの説明が存在するかどうかはわかりません(提示してくれていたリファレンスにある優先度しかないかもしれません)。

なお、rubyの and と orは優先度が同一のようなので、 && や || とは別の特殊なものと捉えた方がいいと思います。

# つまり以下は成り立たない。左はtrueで右はfalse。
( true || true && false) == (true or true and false)
> どのような性質なため

と、言われると評価優先度が低いからなのですが、

and、or は優先度が低いので自分の左右を先に解決してもらおうとします。
```
1 * 2 + 3 * 4
```
と書くと掛け算が優先されるのと同じですね。

``` ruby
def sample(a)
  p !a
end
```
このような関数があった場合に
```
sample true and false
```
と書いた場合、これは
```
(sample true) and false
(sample true) && false
```
と同じ結果になります。

一方
```
sample true && false
```
とした場合は
```
sample (true and false)
sample (true && false)
```
と同じ結果になります。

andやorが優先度が相当に低く設定されているため、andやorを評価する前に周りを評価しようとします。 andやorよりも関数の評価を先に行おうとしますが、そうすると文法的におかしいためにエラーになってしまうため、明示的にandやorを先に評価させるために括弧を書くわけです。

---

余談ですが優先度と括弧は等価ではありませんので
```
sample(true and false)
```
は上の例で示したように
```
(sample(true) and (false))
```
と、andの左右にある塊を括弧で括っても結果は同じになりません。
(運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)


## コメントを受けて追記しました

> メソッドの `sample(foo)` と `sample foo`が等価で二重括弧の一つ目は引数を表すための括弧で、もう一つがandを先に処理するための優先度変更のための括弧という理解であっているでしょうか?

その通りです。
ちなみに細かい話ですが
`sample(foo)` と `sample (foo)` は異なる結果をもたらしますのでここも気を付けてください。

```
sample((true and false))
sample (true and false)
```
は等価です。二個目はメソッド名の次に空白がありますので、メソッドの引数を括る括弧は省略されたとみなされます。
```
sample(true and false)
```
はエラーです。括弧はメソッドの引数を括っているとみなされています。


> メソッドの引数としてのスペースや括弧が && と and の中間の優先度だということだと思うのですが

スペースや括弧というよりはカンマの方が and/orよりも優先度が高いからかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。

引数が一つの場合は単に`sample(3 if true)` と似たような文法エラーという解釈でもいいじゃないでしょうかね。こちらは修飾子ですが `sample((3 if true))` は同じように成功します。


rubyのドキュメントとしてそこまでの説明が存在するかどうかはわかりません(提示してくれていたリファレンスにある優先度しかないかもしれません)。

なお、rubyの and と orは優先度が同一のようなので、 && や || とは別の特殊なものと捉えた方がいいと思います。
``` ruby
# つまり以下は成り立たない。左はtrueで右はfalse。
( true || true && false) == (true or true and false)
```

コメントを受けて追記しました

5599
 (運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)
 
 
+## コメントを受けて追記しました
+
+> メソッドの `sample(foo)` と `sample foo`が等価で二重括弧の一つ目は引数を表すための括弧で、もう一つがandを先に処理するための優先度変更のための括弧という理解であっているでしょうか?
+
+その通りです。
+ちなみに細かい話ですが
+`sample(foo)` と `sample (foo)` は異なる結果をもたらしますのでここも気を付けてください。
+
+```
+sample((true and false))
+sample (true and false)
+```
+は等価です。二個目はメソッド名の次に空白がありますので、メソッドの引数を括る括弧は省略されたとみなされます。
+```
+sample(true and false)
+```
+はエラーです。括弧はメソッドの引数を括っているとみなされています。
+
+
+> メソッドの引数としてのスペースや括弧が && と and の中間の優先度だということだと思うのですが
+
+スペースや括弧というよりはカンマの方が andよりも優先度が高いと考えるとシンプルかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。
+
+rubyのドキュメントとしてそこまでの説明が存在するかどうかはわかりません(提示してくれていたリファレンスにある優先度しかないかもしれません)。
+
+なお、rubyの and と orは優先度が同一のようなので、 && や || とは別の特殊なものと捉えた方がいいと思います。
+``` ruby
+# つまり以下は成り立たない。左はtrueで右はfalse。
+( true || true && false) == (true or true and false)
+```
+
+

どのような性質なため

と、言われると評価優先度が低いからなのですが、

and、or は優先度が低いので自分の左右を先に解決してもらおうとします。

1 * 2 + 3 * 4

と書くと掛け算が優先されるのと同じですね。

def sample(a)
  p !a
end

このような関数があった場合に

sample true and false

と書いた場合、これは

(sample true) and false
(sample true) && false

と同じ結果になります。

一方

sample true && false

とした場合は

sample (true and false)
sample (true && false)

と同じ結果になります。

andやorが優先度が相当に低く設定されているため、andやorを評価する前に周りを評価しようとします。 andやorよりも関数の評価を先に行おうとしますが、そうすると文法的におかしいためにエラーになってしまうため、明示的にandやorを先に評価させるために括弧を書くわけです。


余談ですが優先度と括弧は等価ではありませんので

sample(true and false)

は上の例で示したように

(sample(true) and (false))

と、andの左右にある塊を括弧で括っても結果は同じになりません。
(運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)

コメントを受けて追記しました

メソッドの sample(foo)sample fooが等価で二重括弧の一つ目は引数を表すための括弧で、もう一つがandを先に処理するための優先度変更のための括弧という理解であっているでしょうか?

その通りです。
ちなみに細かい話ですが
sample(foo)sample (foo) は異なる結果をもたらしますのでここも気を付けてください。

sample((true and false))
sample (true and false)

は等価です。二個目はメソッド名の次に空白がありますので、メソッドの引数を括る括弧は省略されたとみなされます。

sample(true and false)

はエラーです。括弧はメソッドの引数を括っているとみなされています。

メソッドの引数としてのスペースや括弧が && と and の中間の優先度だということだと思うのですが

スペースや括弧というよりはカンマの方が andよりも優先度が高いと考えるとシンプルかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。

rubyのドキュメントとしてそこまでの説明が存在するかどうかはわかりません(提示してくれていたリファレンスにある優先度しかないかもしれません)。

なお、rubyの and と orは優先度が同一のようなので、 && や || とは別の特殊なものと捉えた方がいいと思います。

# つまり以下は成り立たない。左はtrueで右はfalse。
( true || true && false) == (true or true and false)
> どのような性質なため

と、言われると評価優先度が低いからなのですが、

and、or は優先度が低いので自分の左右を先に解決してもらおうとします。
```
1 * 2 + 3 * 4
```
と書くと掛け算が優先されるのと同じですね。

``` ruby
def sample(a)
  p !a
end
```
このような関数があった場合に
```
sample true and false
```
と書いた場合、これは
```
(sample true) and false
(sample true) && false
```
と同じ結果になります。

一方
```
sample true && false
```
とした場合は
```
sample (true and false)
sample (true && false)
```
と同じ結果になります。

andやorが優先度が相当に低く設定されているため、andやorを評価する前に周りを評価しようとします。 andやorよりも関数の評価を先に行おうとしますが、そうすると文法的におかしいためにエラーになってしまうため、明示的にandやorを先に評価させるために括弧を書くわけです。

---

余談ですが優先度と括弧は等価ではありませんので
```
sample(true and false)
```
は上の例で示したように
```
(sample(true) and (false))
```
と、andの左右にある塊を括弧で括っても結果は同じになりません。
(運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)


## コメントを受けて追記しました

> メソッドの `sample(foo)` と `sample foo`が等価で二重括弧の一つ目は引数を表すための括弧で、もう一つがandを先に処理するための優先度変更のための括弧という理解であっているでしょうか?

その通りです。
ちなみに細かい話ですが
`sample(foo)` と `sample (foo)` は異なる結果をもたらしますのでここも気を付けてください。

```
sample((true and false))
sample (true and false)
```
は等価です。二個目はメソッド名の次に空白がありますので、メソッドの引数を括る括弧は省略されたとみなされます。
```
sample(true and false)
```
はエラーです。括弧はメソッドの引数を括っているとみなされています。


> メソッドの引数としてのスペースや括弧が && と and の中間の優先度だということだと思うのですが

スペースや括弧というよりはカンマの方が andよりも優先度が高いと考えるとシンプルかもしれません(引数が1つの場合はわかりにくいですが、perlが同様に notとandとorを持っていてこれがカンマより低いです。なお、perlとはいろいろ異なるのでエラーが出る出ないとか存在意義などはいろいろ異なると思います)。

rubyのドキュメントとしてそこまでの説明が存在するかどうかはわかりません(提示してくれていたリファレンスにある優先度しかないかもしれません)。

なお、rubyの and と orは優先度が同一のようなので、 && や || とは別の特殊なものと捉えた方がいいと思います。
``` ruby
# つまり以下は成り立たない。左はtrueで右はfalse。
( true || true && false) == (true or true and false)
```

回答を投稿

どのような性質なため

と、言われると評価優先度が低いからなのですが、

and、or は優先度が低いので自分の左右を先に解決してもらおうとします。

1 * 2 + 3 * 4

と書くと掛け算が優先されるのと同じですね。

def sample(a)
  p !a
end

このような関数があった場合に

sample true and false

と書いた場合、これは

(sample true) and false
(sample true) && false

と同じ結果になります。

一方

sample true && false

とした場合は

sample (true and false)
sample (true && false)

と同じ結果になります。

andやorが優先度が相当に低く設定されているため、andやorを評価する前に周りを評価しようとします。 andやorよりも関数の評価を先に行おうとしますが、そうすると文法的におかしいためにエラーになってしまうため、明示的にandやorを先に評価させるために括弧を書くわけです。


余談ですが優先度と括弧は等価ではありませんので

sample(true and false)

は上の例で示したように

(sample(true) and (false))

と、andの左右にある塊を括弧で括っても結果は同じになりません。
(運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)

> どのような性質なため

と、言われると評価優先度が低いからなのですが、

and、or は優先度が低いので自分の左右を先に解決してもらおうとします。
```
1 * 2 + 3 * 4
```
と書くと掛け算が優先されるのと同じですね。

``` ruby
def sample(a)
  p !a
end
```
このような関数があった場合に
```
sample true and false
```
と書いた場合、これは
```
(sample true) and false
(sample true) && false
```
と同じ結果になります。

一方
```
sample true && false
```
とした場合は
```
sample (true and false)
sample (true && false)
```
と同じ結果になります。

andやorが優先度が相当に低く設定されているため、andやorを評価する前に周りを評価しようとします。 andやorよりも関数の評価を先に行おうとしますが、そうすると文法的におかしいためにエラーになってしまうため、明示的にandやorを先に評価させるために括弧を書くわけです。

---

余談ですが優先度と括弧は等価ではありませんので
```
sample(true and false)
```
は上の例で示したように
```
(sample(true) and (false))
```
と、andの左右にある塊を括弧で括っても結果は同じになりません。
(運がいいのか悪いのか、意図と異なる形で文法的に問題なくなるため)