## 4.比較與邏輯
### 4.1。 邏輯運算符
邏輯運算符使你可以確定天氣是否正確。 例如,一個就是一個,那就是人類的想法,讓我們看看計算機對此的想法。 發射你的 irb 并輸入 1 等于 1,如圖所示
```rb
>> 1 == 1
=> true
```
好吧,那等于符號的兩倍呢? 單個等于號表示分配,例如`a = 5`,將值`5`放入`a`。 雙等于符號是比較。 因此,以上我們檢查了 1 是否等于 1 且答案為`true`。 電腦是智能的,不是嗎? OK,現在讓我們檢查 1 是否等于 2,所以我們輸入`1==2`和...
```rb
>> 1 == 2
=> false
```
計算機(在這種情況下為 Ruby 解釋器)告訴計算機`false`。
很好,如果在我們鍵入計算機時 1 與計算機不等于 2,則必須輸出 true,因此請在控制臺中鍵入
```rb
>> 1 != 2
=> true
```
`!=`代表不等于。 ! 代表不
現在我們檢查 1 是否不等于 1,并且計算機按預期給出`false`作為輸出。
```rb
>> 1 != 1
=> false
```
現在,我們檢查 2 是否大于 3,對于大于,我們使用`>`符號
```rb
>> 2 > 3
=> false
```
現在,我們將檢查 2 是否小于 3,因為小于`<`符號
```rb
>> 2 < 3
=> true
```
涼! 我們發現如果 2 不大于 3,則其小于 3。那么我們將獲得數學諾貝爾獎:)
`>=`代表大于或等于
```rb
>> 5 >= 3
=> true
```
由于 5 大于 3,因此返回`true`
參見下面的表達式,因為 5 等于 5,它仍然返回`true`
```rb
>> 5 >= 5
=> true
```
5 不大于 5,因此在下面返回 false
```rb
>> 5 > 5
=> false
```
3 小于 5,因此小于或等于運算符`?`返回 true
```rb
>> 3 <= 5
=> true
```
3 等于 3,因此小于或等于運算符仍返回 true
```rb
>> 3 <= 3
=> true
```
3 不小于 3,等于 3,因此小于運算符返回`false`
```rb
>> 3 < 3
=> false
```
你也可以嘗試使用數字
<colgroup><col style="width: 50%;"> <col style="width: 50%;"></colgroup>
| 操作員 | 含義 |
| ! < | 不小于 |
| ! > | 不大于 |
他們工作嗎? ;)
### 4.2。 true!=“ true”
在邏輯運算符部分,你可能會看到 irb 提供`true`或`false`作為輸出。 你不要與`“true”`和`“false”`混淆。 `true`和`false`是邏輯值,而`“true”`和`“false”`是`String`。
### 4.3。 ===
`===`運算符用于檢查特定實例 <sup class="footnote">[ [12](#_footnotedef_12 "View footnote.") ]</sup> 是否屬于一類(即類型)。 例如,`“abc”`是`String`類型的對象,`1`是`Integer`,因此讓我們在其上應用`===`并檢查
```rb
>> String === "abc"
=> true
>> Integer === 1
=> true
```
從上面的示例中可以看到,我們在左邊有類名,在右邊有實例。 前兩個示例為`true`,因為`“abc”`為字符串,`1`為整數。
```rb
>> String === 7
=> false
```
在上面的示例中,由于`7`絕對不是`String`,因此它顯然返回 false,這就是你可能會想到的;)
但是有些奇怪,請看下面的例子
```rb
>> "abc" === String
=> false
```
因此,始終將類放在左側,將實例放在右側。
### 4.4。 如果
如果滿足條件,則使用 if 關鍵字執行語句。 看看下面的程序。 執行它。
```rb
# if.rb
puts "Whats your name?"
name = gets.chop
puts "#{name} is genius" if name == "Zigor"
puts "#{name} is idiot" if name != "Zigor"
```
如果你輸入的名稱不是 Zigor,結果將會是這樣
```rb
Whats your name?
Karthik
Karthik is idiot
```
看一下程序。 看一下下面這行
```rb
puts "#{name} is genius" if name == "Zigor"
```
該程序在名為`name`的變量中獲取你的名字。 現在,它檢查上面代碼中名稱是否為 Zigor(在關鍵字`if`的右側),如果是,則執行與之關聯的語句(即關鍵字`if`的左側的語句) ),在這種情況下,它會打印出特定的名稱是 genius。 然后歸結為下一條語句
```rb
puts "#{name} is idiot" if name != "Zigor"
```
在此語句中,它檢查名稱是否不是 Zigor,如果是,則打印名稱為 idiot。
### 4.5。 如果別的
讓我們以另一種形式編寫 who genius 程序,這里我們使用 if else 條件代替`if`。 看一下下面的名為 if_else.rb 的代碼
```rb
# Zigor says if the person is intelligent or not
print "Enter your name: "
name = gets.chop
if name == "Zigor"
puts "#{name} is intelligent"
else
puts "#{name} is idiot"
end
```
程序在執行時會提供與先前的 if.rb 相同的輸出,不同之處在于程序內部邏輯的表示方式。 我們看到一個叫做`if name == "Zigor"`的東西,然后在代碼正確的情況下執行該操作,如圖所示
```rb
if name == "Zigor"
puts "#{name} is intelligent"
```
現在,我們可以在之后放置任意數量的語句,如果滿足給定的條件,則所有語句將被執行。 到目前為止,還不錯,但是 Ruby 如何知道 if 語句在哪里結束呢? 為了說到此為止,我們如下所示放置了`end`關鍵字。
```rb
if name == "Zigor"
puts "#{name} is intelligent"
end
```
假設`if`中給出的條件不滿足,我們需要做一些`if`條件無效的操作,然后將條件失敗時執行的語句放在`else`關鍵字下,如下所示
```rb
if name == "Zigor"
puts "#{name} is intelligent"
else
puts "#{name} is idiot"
end
```
請注意,`else`和條件失敗時需要執行的語句位于`end`語句之前。 結束標記`if else`塊的結束。 不一定總是需要其他,而是可以有一個如下所示的代碼
```rb
if <condition>
# many lines of code goes here
end
```
在上面,你可以在`if … end`塊中放入許多需要執行的代碼。
### 4.6。 埃爾斯夫
當我們使用`if`和`else`時,如果滿足條件,則將執行`if`下的代碼,否則將執行`else`部分下的代碼。 讓我們有一個新的場景,其中`if`下的代碼不滿足,然后程序立即跳轉到`else`部分,現在邏輯要求我們也需要在`else`級別檢查另一個條件,我們應該怎么做? 做? 為了應對這種情況,我們可以使用`elsif`命令。 看看下面的代碼
```rb
# elsif.rb
# finds the greatest of three numbers
a,b,c = 3,7,5
if a >= b and a >= c
puts "a = #{a} is greatest"
elsif b >= c and b >= a
puts "b = #{b} is greatest"
else puts "c = #{c} is greatest"
end
```
執行后會產生以下結果
```rb
b = 7 is greatest
```
讓我們逐步瀏覽代碼。 讓我們看看這條線
```rb
a,b,c = 3,7,5
```
在這一行中,我們為變量`a,b`和`c`分配值 3、7 和 5。 現在來看 if 語句
```rb
if a > b and a > c
```
在此語句中,我們檢查`a`是否大于`b`和`a`是否大于`c`。 注意關鍵字`and`。 僅當兩個條件都為真時,才滿足`if`條件。 `a`小于`b`,因此此條件失敗,因此程序跳過`if`語句并進入`elsif`語句
```rb
elsif b > c and b > a
```
`elsif`是`else`加`if`,在這里我們檢查由`and`分隔的另外兩個條件,我們檢查`b `is greater than `a`和`b`是否大于`c`,兩者均為真,因此 `elsif`下的聲明
```rb
puts "b = #{b} is greatest"
```
得到執行,我們得到結果。 由于`elsif`滿足其他`else`的要求,并且其下的代碼也將被忽略。
### 4.7。 如果那樣的話
還有另一個條件構造,它的 if 稱為 if then else,它與 if else 并沒有太大區別,下面出于理論目的顯示了一個示例,就我個人而言,它并沒有任何實際目的,但是出于理論上的考慮 將示例放在下面,執行并親自查看。
```rb
#if_then_else.rb
number = 42
if number % 2 == 0
then
puts "Even"
else
puts "Odd"
end
```
### 4.8。 除非
除非是檢查狀況的另一種方法。 假設一個人是未成年人,除非他或她大于 18 歲。 那么如何在 Ruby 中編碼呢? 考慮下面的程序,在文本編輯器中鍵入并執行它。
```rb
# unless.rb
print "Enter your age:"
age = gets.to_i
p "You are a minor" unless age >= 18
```
執行后,這就是我們得到的
```rb
Enter your age:16
"You are a minor"
```
程序會詢問你的年齡,如果年齡不大于 18,則表示你是未成年人。也就是說,除非你的年齡大于或等于 18(如在此情況下所示),否則你將是未成年人`unless age >= 18`。 `p`是看跌期權 <sup class="footnote">[ [13](#_footnotedef_13 "View footnote.") ]</sup> 的簡稱。 如果編寫`puts “something”`,則紅寶石解釋程序將打印`something`。 如果你使用`p ”something”`,則紅寶石解釋器將打印`”something”`(這與這些引號一起使用)。
如果我們想在`unless`塊下放置多行代碼,可以使用`unless …?. end`塊,如下所示
```rb
unless <condition>
# many lines of code goes here
end
```
如果`<condition>`失敗,則執行塊中的代碼。 可以認為`unless`與`if`相反。 如果 if 塊被執行`if`的條件是`true`,則`unless`塊被執行的條件是`false`。
### 4.9。 除非另有
就像`if`和`else`一樣,我們可以在`unless`語句中使用`else`。 輸入以下程序并執行
```rb
# unless_1.rb
print "Enter your age:"
age = gets.to_i
unless age >= 18
p "You are a minor"
else p "You are a grown up"
end
```
這是執行時得到的
```rb
Enter your age:37
"You are a grown up"
```
好的,這是它的工作原理,你可以確定年齡,將其轉換為`age = gets.to_i`中的整數,并將其存儲在名為`age`的變量中。 專注于這段代碼:
```rb
unless age >= 18
p "You are a minor"
else p "You are a grown up"
end
```
除非`age`小于 18 `“You are a minor”`不會被打印出來。 如果年齡大于或等于 18,則將其路由到`else`語句,并打印`“You are a grown up”`。 請注意,如果將`else`與`unless`一起使用,則必須使用`end`命令終止`unless`塊。
現在讓我們看一下另一個使用`unless else`的程序。 我們想招募人員來武裝,這個人應該在 18 到 35 歲之間,我們的計劃向想要入學的人詢問詳細信息,檢查其年齡并告知結果。 在下面輸入程序并執行
```rb
# unless_2.rb
print "Enter your age:"
age = gets.to_i
unless age < 18 or age > 35
p "You can enter Armed forces"
else p "You cannot enter Army. You are either too young or too old"
end
```
執行時將是結果
```rb
Enter your age:23
"You can enter Armed forces"
```
我認為你可以自行解釋該程序。 如果沒有其他聯系方式,除非我很懶,否則我會寫一個解釋。
### 4.10。 情況何時
假設你要編寫一個程序,該程序對于確定的輸入具有確定的輸出,則可以在以下情況下使用這種情況。 假設我們要編寫一個拼寫為 1 到 5 的程序,我們可以按照 code / case_when.rb [case_when.rb]中所示的方法進行操作,在文本編輯器中鍵入該程序并執行。
```rb
# case_when.rb
# This program spells from one to five
print "Enter a number (1-5):"
a = gets.to_i
spell = String.new
case a
when 1
spell = "one"
when 2
spell = "two"
when 3
spell = "three"
when 4
spell = "four"
when 5
spell = "five"
else
spell = nil
end
puts "The number you entered is "+spell if spell
```
輸出量
```rb
Enter a number (1-5):4
The number you entered is four
```
讓我們看看上面的程序是如何工作的。 首先,提示用戶輸入數字,當他輸入數字時,在以下語句中將其從字符串轉換為整數
```rb
a = gets.to_i
```
變量`a`現在包含我們輸入的數字的值,我們具有`case`語句,如下所示
```rb
case a
…......
end
```
在上面的空 case 語句中,我們將編寫根據`a`的值執行的代碼。 當`a`為 1 時,我們需要將其拼寫為`“one”`,因此我們添加以下代碼
```rb
case a
when 1
spell = "one"
end
```
同樣,我們添加代碼直到大小寫為 5,如圖所示
```rb
case a
when 1
spell = "one"
when 2
spell = "two"
when 3
spell = "three"
when 4
spell = "four"
when 5
spell = "five"
end
```
在某些情況下,運行此程序的人員可能會輸入錯誤的信息,因此我們也需要處理這些情況。 為此,我們添加了一個名為`else`的特殊語句,如果所有情況都失敗了,則執行 else 下的代碼,但是必須注意,在`case … end`塊之間沒有`else`是強制性的。 所以現在程序更改如下所示
```rb
case a
when 1
spell = "one"
when 2
spell = "two"
when 3
spell = "three"
when 4
spell = "four"
when 5
spell = "five"
else
spell = nil
end
```
接下來,我們要做的就是打印出`spell`,我們在以下語句中這樣做
```rb
puts "The number you entered is "+spell if spell
```
請注意,僅當`spell`包含值時才打印,否則,如果`spell`為`nil`,則不打印任何內容。 上面聲明中的`if`條件要小心。
有時可能有必要針對許多條件執行同一組語句。 讓我們以一個示例應用程序為例,在該應用程序中,程序確定 1 到 10(包括兩者)之間的數字是奇數或偶數。 鍵入下面的代碼(code / case_odd_even.rb [case_odd_even.rb])并執行
```rb
# case_odd_even.rb
num = 7 # put any number from 1 to 10
case num
when 1, 3, 5, 7, 9
puts "#{num} is odd"
when 2, 4, 6, 8, 10
puts "#{num} is even"
end
```
Output
```rb
7 is odd
```
注意,在上面的程序中,我們為變量`num`分配了值 7,接下來,我們將`num`放入`case`語句中。 當數字為 1、3、5、7 和 9 時,我們需要打印其奇數,因此我們要做的只是對個案進行分組。 如果滿意,則必須將其打印為`odd`,如果你按照下面的代碼所示放置,就足夠了
```rb
case num
when 1, 3, 5, 7, 9
puts "#{num} is odd"
end
```
接下來,我們只需要打印數字,即使該數字是 2、4、6、8 和 10,要做到這一點,我們要做的就是添加下面突出顯示的代碼
```rb
case num
when 1, 3, 5, 7, 9
puts "#{num} is odd"
when 2, 4, 6, 8, 10
puts "#{num} is even"
end
```
而已。 該代碼適用于從 1 到 10 的所有數字。故事的寓意是,我們可以輕松地將案例分組并在其中執行通用代碼。
### 4.11。 情況下,檢查類類型
在 Ruby 中,一切都是對象。 讓我們在 irb 中嘗試一些例子來證明這一點
```rb
>> 1.class
=> Integer
>> "Zigor".class
=> String
```
在第一條語句中,我們查詢了`1`的類/對象類型,并說其類型為`Integer`。 當被問及`“Zigor”`的類別時,它說`String`。 在 Ruby 中,你可以使用此函數來了解所使用的類型變量。 它是一個非常強大的功能。
現在看看下面的程序
```rb
# case_when_checking_class_type.rb
a = "Zigor"
case a
when String
puts "Its a string"
when Fixnum
puts "Its a number"
end
```
Output
```rb
Its a string
```
參見上面程序中的行,我們有兩個語句,例如`when String`和`when Integer`,這將檢查`case a`語句中變量`a`的類型。 如果變量類型為`String`,它將在`when String`事物下執行語句,而當其為`Integer`時,將執行另一個語句。 由于此`a`是 String 類型的,因此我們得到了打印輸出`Its a String`。
### 4.12。 情況和范圍
請檢查以防萬一。
### 4.13。 情況以及正則表達式
Case 語句也可以匹配正則表達式。 閱讀正則表達式部分以了解以下示例。
```rb
# case_when_regexp.rb
string = "I Love Ruby"
# string = "I Love Python"
case string
when /Ruby/
puts "string contains Ruby"
else
puts "string does not contain Ruby"
end
```
Output
```rb
string contains Ruby
```
在上面的示例中,檢查語句`when /Ruby/`,它會檢查表達式`/Ruby/`出現在`string`中。 在上面的示例中,它確實出現了。 因此它打印出`string contains Ruby`。
### 4.14。 情況何時和 lambdas
在 [case_odd_even.rb](code/case_odd_even.rb) 中,當我們嘗試檢查數字是否為奇數或偶數時,我們給出了一個冗長的程序,其范圍限制為 1 到 10 之間的數字。 我們可以編寫如下所示的相同程序
```rb
# case_odd_even_lambda.rb
num = 76
case num
when -> (n) { n % 2 == 0 }
puts "#{num} is even"
else
puts "#{num} is odd"
end
```
Output
```rb
76 is even
```
要理解以上示例,你必須先閱讀 Proc,Lambda 和 Blocks。 觀看代碼`when → (n) { n % 2 == 0 }`,在其中將一個 lambda 傳遞給`when`,當調用該代碼時,它將為`n`的值 76 或任何偶數返回`true`,如果`n`為奇數則返回`false` 。 因此,與以前的奇偶程序不同,它適用于從零到無限的所有自然數。
### 4.15。 case 和 matcher 類的情況
要了解下面的程序,你需要閱讀===并檢查案例類型時的大小寫。 在下面輸入程序并執行
```rb
# case_when_matcher_classes.rb
class Zigor
def self.===(string)
string.downcase == "zigor"
end
end
name = "Zigor"
case name
when Zigor
puts "Nice to meet you Zigor!!!"
else
puts "Who are you?"
end
```
Output
```rb
Nice to meet you Zigor!!!
```
考慮這一部分
```rb
case name
when Zigor
puts "Nice to meet you Zigor!!!"
else
puts "Who are you?"
end
```
`case`語句檢查`name`并查看其實例類型是否為`Zigor`。 嗯,這并不奇怪嗎? 怎么可能 屬于`String`類的一個實例如何變為`Zigor`類的一個實例? 好吧,情況是什么,它調用了`Zigor`類中的`===`方法,其定義可以在 <sup class="footnote">[ [14](#_footnotedef_14 "View footnote.") ]</sup> 下看到。
```rb
def self.===(string)
string.downcase == "zigor"
end
```
在這里我們定義`self.===`,在其中接受一個參數字符串,在這里傳遞給`case`的`name`被復制到`string`,并檢查`string`的`downcase`是否等于`“zigor”` 在`string.downcase == "zigor"`中,如果是,則返回`true`,否則返回`false`。 如果`true`被執行,當 when Zigor 塊中的代碼被執行時,我們得到輸出`Nice to meet you Zigor!!!`。 將名稱更改為其他值,然后看看會發生什么。
如果你現在不了解此章節,請不要擔心。 在完成本書的復習之后,你可能會更好地理解它。
### 4.16。 ? :
`? :`被稱為三元運算符。 它可以用作簡單的`if`。 請執行以下所示的程序。 專心`max = a > b ? a : b`
```rb
# max_of_nums.rb
a,b = 3,5
max = a > b ? a : b
p "max = "+max.to_s
```
執行后,程序給出以下輸出
```rb
"max = 5"
```
?:的工作原理如下。 它的語法是這樣的
```rb
<evaluate something > ? <if true take this thing> : <if false take this thing>
```
你在問號之前給出一個表達式。 該表達式必須返回`true`或`false`。 如果表達式返回 true,則`it`返回`?`和`:`之間的內容;如果`false`,則返回`:`之后的內容。
在表達中
```rb
max = a > b ? a : b
```
我們可以如下替換`a`和`b`的值
```rb
max = 3 > 5 ? 3 : 5
```
3 不大于 5,因此其`false`。 因此,將`:`之后的值分配給`max`。 因此,`max`變為 5。
### 4.17。 將邏輯語句分配給變量
不管你是否注意到了天氣,在前面的示例 [max_of_nums.rb](code/max_of_nums.rb) 中,我們使用了這樣的語句
```rb
max = a > b ? a : b
```
這里`a > b`是邏輯,如果它的`true`它將返回`a`,該`a`被分配給`max`,或者它返回`b`,其被分配給`max`。
現在相同的程序可以編寫如下
```rb
# max_of_nums_with_if.rb
a, b = 3, 5
max = if a > b
a
else
b
end
p "max = " + max.to_s
```
Output
```rb
"max = 5"
```
此處將變量`max`分配給`if`條件。 因此,如果`a`大于`b`,則會將`a`放入`max`,否則會將`b`放入`max`。 就如此容易。
現在還有另一件事。 如果`if`或`else`下還有其他語句怎么辦? 由于在此代碼塊中
```rb
max = if a > b
a
else
b
end
```
在`if`塊下只有一個語句`a`,在`else`塊下我們只有`b`,所以它很簡單。 現在讓我們嘗試下面給出的示例
```rb
# max_of_nums_with_if_many_statements.rb
a,b = 3,5
max = if a > b
a + b
a
else
a - b
b
end
p "max = "+max.to_s
```
運行上面的程序,這就是你得到的
```rb
"max = 5"
```
那么要推斷什么呢? 規則是這樣的,如果你在一個塊中給出許多語句并將其分配給一個變量,則最后一條語句的輸出將被返回并將被放入變量 <sup class="footnote">[ [15](#_footnotedef_15 "View footnote.") ]</sup> (在這種情況下為最大值)。
這是另一個程序, [case_when.rb](code/case_when.rb) 的分支,我想你知道它現在如何工作
```rb
# case_when_2.rb
# This program spells from one to five
print "Enter a number (1-5):"
a = gets.to_i
spell = String.new
spell = case a
when 1
"one"
when 2
"two"
when 3
"three"
when 4
"four"
when 5
"five"
else
nil
end
puts "The number you entered is " + spell if spell
```
運行并親自查看。
- 前言
- 紅寶石
- 先決條件
- 1.安裝 Ruby
- 2.在線資源
- 3.入門
- 4.比較與邏輯
- 5.循環
- 6.數組
- 7.哈希和符號
- 8.范圍
- 9.功能
- 10.可變范圍
- 11.類&對象
- 12.安全導航
- 13.打破大型程序
- 14.結構和 OpenStruct
- 15. Rdoc
- 16. Ruby 樣式指南
- 17.模塊和混入
- 18.日期和時間
- 19.文件
- 20. Proc,Lambda 和塊
- 21.多線程
- 22.異常處理
- 23.正則表達式
- 24.寶石
- 25.元編程
- 26.基準
- 27.測試驅動開發
- 28.觀察者模式
- 29.模板模式
- 30.工廠模式
- 31.裝飾圖案
- 32.適配器模式
- 33.單例模式
- 34.復合模式
- 35.建造者模式
- 36.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書