<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Ruby 中的對象 > 原文: [https://zetcode.com/lang/rubytutorial/objects/](https://zetcode.com/lang/rubytutorial/objects/) 在 Ruby 教程的這一部分中,我們將簡要介紹 Ruby 語言中對象的概念。 我們將在 OOP 一章中了解有關對象的更多信息。 我寫了有關對象的本章,因為許多 Ruby 功能可能會使新手感到困惑,特別是如果他們已經知道任何其他編程語言的話。 Ruby 是一種面向對象的編程語言。 這意味著在 Ruby 程序中,我們使用對象。 從語言程序員的角度來看,Ruby 程序是令牌流。 這些標記是 Ruby 關鍵字,運算符,各種分隔符或字面值。 從語義的角度來看,Ruby 程序由對象組成。 這些對象是在 Ruby 腳本的生存期內創建和修改的。 有兩種對象:內置對象和自定義對象。 內置對象是所有程序員都可以使用的預定義對象。 它們以 Ruby 語言的核心或各種庫提供。 定制對象是由應用員為其應用域創建的。 必須先創建所有對象,然后才能使用它們。 我們經常使用術語對象實例化。 它是對象創建的同義詞。 對象由數據和方法組成。 數據是對象的靜態部分。 方法構成對象的動態部分。 對象被修改并通過方法彼此通信。 ```ruby #!/usr/bin/ruby puts "Ruby language" ``` 我們有一個簡單的 Ruby 腳本。 如果我們熟悉某些程序語言(例如 Pascal 或 C),我們可能會看到一個名為`puts`的關鍵字或函數及其參數`"Ruby language"`(它是一個字符串)。 Ruby 是一種純粹的面向對象的語言,情況有所不同。 `"Ruby language"`確實是一個字符串,它是一種常見的數據類型。 但這也是一個對象。 與所有對象一樣,我們可以調用其方法。 這與其他語言有點不同。 `puts`是一種方法。 方法是在對象中定義的函數。 方法本身并不存在。 實際上,`puts`方法是`Kernel`模塊的一部分。 ```ruby #!/usr/bin/ruby Kernel.puts "Ruby language" Kernel.puts "Ruby language".size ``` 在上面的腳本中,我們有兩個代碼行。 ```ruby Kernel.puts "Ruby language" ``` 在第一個示例中,我們調用的`puts`方法沒有`Kernel`部分,可以將其省略。 這樣可以節省時間和一些打字。 實際上,這是`Kernel.puts`正式電話的簡寫。 在 C# 中,我們有`Console.writeln`在 Java 中`System.println`。 想法是一樣的。 方法必須與某個對象關聯,或者,如果是類方法,則必須與一個類關聯。 ```ruby Kernel.puts "Ruby language".size ``` 在此代碼行中,我們將`"Ruby language"`字符串的大小打印到控制臺。 這可能會使使用其他語言編寫代碼的程序員感到困惑。 在其他語言中,字符串是無法修改的原始數據類型,并且缺少其自己的方法。 在 Ruby 中,字符串是完整對象,并且具有自己的方法。 `size`方法就是其中一種。 它以字符為單位返回字符串的大小。 ```ruby $ ./simple2.rb Ruby language 13 ``` 代碼示例的輸出。 在下面的示例中,我們將看一個整數。 與字符串類似,整數值也是 Ruby 對象。 ```ruby #!/usr/bin/ruby puts 6.object_id puts 6.even? puts 6.zero? puts 6.class ``` 在示例中,我們有一個整數 6。我們在數字上調用了一些方法。 ```ruby puts 6.object_id ``` 6 是一個對象。 `object_id`是一種方法。 該方法返回與該對象關聯的 ID。 每個對象都有一個 ID。 如果我們在對象上調用方法,則必須始終在兩者之間放置點字符。 ```ruby puts 6.even? puts 6.zero? ``` 在這里,我們在 6 個對象上調用兩個方法。 如果數字為偶數,則`even?`返回`true`。 如果數字等于零,則`zero?`方法返回`true`。 請注意,這兩種方法都以問號結尾。 這是 Ruby 約定。 返回布爾值的方法以問號結尾。 ```ruby puts 6.class ``` `class`方法告訴我們正在處理哪種對象。 在我們的例子中 6 是`Fixnum` ```ruby $ ./objectnumber.rb 13 true false Fixnum ``` 代碼示例輸出。 ## Ruby 對象創建 我們已經提到必須先創建 Ruby 對象,然后才能使用它們。 可以隱式或顯式創建對象。 隱式對象創建是通過字面值符號創建對象。 顯式對象的創建通過使用`new`關鍵字進行。 始終使用`new`關鍵字創建自定義對象。 必須從特定的類創建自定義對象。 類是對象的模板。 一個類可以用來創建許多對象。 ```ruby #!/usr/bin/ruby class Being end puts 67 puts "ZetCode" s = String.new "ZetCode" puts s # n1 = Fixnum.new 67 # puts n1 b = Being.new puts b ``` 該代碼示例演示了如何在 Ruby 中創建對象。 ```ruby class Being end ``` 這是名為`Being`的自定義對象的模板。 使用`class`關鍵字創建模板。 自定義對象的模板通常放在源文件的頂部或單獨的 Ruby 文件中。 ```ruby puts 67 puts "ZetCode" ``` 在這兩行中,我們使用兩個對象。 `Fixnum`類型的 67 對象和`String`類型的`"ZetCode"`字符串。 67 和`"ZetCode"`是我們所謂的字面值。 字面值是類型的特定值的字面值表示。 這兩個對象是由 Ruby 解釋器在后臺創建的。 Ruby 中的某些對象是通過在源代碼中指定其字面值來創建的。 ```ruby s = String.new "ZetCode" puts s ``` 這是創建`String`對象的正式方法。 它等于之前使用字符串字面值的隱式創建。 ```ruby # n1 = Fixnum.new 67 # puts n1 ``` 并非所有內置對象都可以使用`new`方法創建。 此代碼無法編譯。 到目前為止,`Fixnum`數字只能用字面值表示法創建。 ```ruby b = Being.new puts b ``` 在這里,我們創建了自定義對象的實例。 `puts`方法為我們簡要介紹了該對象。 ```ruby $ ./ocreation.rb 67 ZetCode ZetCode #<Being:0x9944d9c> ``` 示例的輸出。 我們將繼續進行一些正式的對象創建。 ```ruby #!/usr/bin/ruby s1 = String.new "Ruby" puts s1.size puts s1.downcase a1 = Array.new a1.push 1, 2, 3 puts a1.include? 3 puts a1.empty? r1 = Range.new 1, 6 puts r1.class puts r1.include? 4 ``` 在示例中,我們創建了三個內置對象并調用了其中的一些方法。 ```ruby s1 = String.new "Ruby" puts s1.size puts s1.downcase ``` 創建一個`String`對象。 我們調用對象的兩種方法。 `size`方法返回字符串的大小。 `downcase`方法將字符串的字符小寫。 ```ruby a1 = Array.new a1.push 1, 2, 3 puts a1.include? 3 puts a1.empty? ``` 在這里,我們創建一個`Array`對象,并向其添加三個數字。 稍后我們調用兩個數組方法。 `include?`方法檢查特定值(在我們的例子中為 3)是否是數組的一部分。 `empty?`方法返回一個布爾值,指示該數組是否為空。 ```ruby r1 = Range.new 1, 6 puts r1.class puts r1.include? 4 ``` 創建`Range`類的實例。 它包含從 1 到 6 的數字。`class`方法返回對象的名稱。 `include?`方法檢查數字 4 是否在范圍內。 就我們而言。 ```ruby $ ./formal.rb 4 ruby true false Range true ``` 運行示例將給出此輸出。 ## Ruby 對象字面值 正如我們已經提到的,可以使用對象字面值來創建一些內置對象。 以下示例顯示了幾個對象字面值。 ```ruby #!/usr/bin/ruby 4.times { puts "Ruby" } puts "Ruby".size puts "Ruby".downcase puts [1, 2, 3].include? 3 puts [1, 2, 3].empty? puts :name.class puts :name.frozen? puts (1..6).class puts (1..6).include? 4 ``` 在上面的示例中,我們使用字面值符號創建一個`Fixnum`,字符串,數組,符號和范圍。 ```ruby 4.times { puts "Ruby" } ``` 我們可以立即在整數字面值上調用方法。 該行向終端打印四次`"Ruby"`字符串。 ```ruby puts "Ruby".size puts "Ruby".downcase ``` 我們在用字符串字面值創建的`String`對象上調用兩個方法。 ```ruby puts [1, 2, 3].include? 3 puts [1, 2, 3].empty? ``` 在這里,我們使用數組字面值符號創建兩個`Array`對象。 我們使用`include?`方法檢查特定的數字是否是數組的一部分。 `empty?`方法檢查數組對象是否為空。 ```ruby puts :name.class puts :name.frozen? ``` 調用 Symbol 對象的兩種方法。 該符號是用一個以冒號開頭的符號字面值創建的。 ```ruby puts (1..6).class puts (1..6).include? 4 ``` 使用范圍字面值創建兩個`Range`對象。 我們在那些對象上調用兩個方法。 `class`方法返回類的名稱,`include?`方法檢查給定數字是否在范圍內。 ```ruby $ ./literals.rb Ruby Ruby Ruby Ruby 4 ruby true false Symbol false Range true ``` 示例輸出。 ## Ruby 對象層次結構 在許多面向對象的語言中,對象形成層次結構。 Ruby 也具有對象層次結構。 它是一個樹狀的層次結構,其中有父對象和子對象。 對象從其父對象繼承數據和行為。 在層次結構的頂部,有根對象。 它稱為`Object`。 Ruby 中的每個對象都有至少一個父對象。 換句話說,每個對象都繼承自基本的`Object`對象。 根據 Ruby 的官方文檔,`Object`是 Ruby 類層次結構的根。 除非明確重寫,否則它的方法可用于所有類。 ```ruby #!/usr/bin/ruby puts 4.is_a? Object puts "Ruby".is_a? Object puts [2, 3].is_a? Object puts :name.is_a? Object puts (1..2).is_a? Object ``` 在上面的代碼示例中,我們演示了所有對象均從根`Object`繼承 ```ruby puts 4.is_a? Object ``` 我們使用`is_a?`方法檢查數字是否為特定類型:換句話說,數字是否繼承自給定的對象類型。 ```ruby $ ./mother.rb true true true true true ``` 所有方法均返回`true`,這意味著所有對象均從母對象繼承。 即使對于非常基本的 Ruby 對象,繼承層次結構也可能非常復雜。 ```ruby #!/usr/bin/ruby puts 6.class puts 6.is_a? BasicObject puts 6.is_a? Object puts 6.is_a? Numeric puts 6.is_a? Integer puts 6.is_a? Fixnum puts 6.is_a? Bignum puts 6.is_a? String ``` 在此示例中,我們對較小數值的繼承層次結構有所了解。 ```ruby puts 6.class ``` 我們找出數字值為 6 的對象是什么。該行將`Fixnum`打印到控制臺。 ```ruby puts 6.is_a? BasicObject puts 6.is_a? Object puts 6.is_a? Numeric puts 6.is_a? Integer puts 6.is_a? Fixnum ``` 以上所有行均返回`true`。 數字 6 是`Fixnum`。 從 Ruby 文檔中,我們發現其他四個對象是`Fixnum`對象的父對象。 ```ruby puts 6.is_a? Bignum puts 6.is_a? String ``` 以上兩個對象不是 6 值的父對象。 ```ruby $ ./inheritance.rb Fixnum true true true true true false false ``` 示例的輸出。 我們將以一個示例結束本節,該示例演示自定義用戶對象的繼承。 ```ruby #!/usr/bin/ruby class Being def to_s "This is Being" end def get_id 9 end end class Living < Being def to_s "This is Living" end end l = Living.new puts l puts l.get_id puts l.is_a? Being puts l.is_a? Object puts l.is_a? BasicObject ``` 在示例中,我們創建兩個對象`Being`和`Living`。 `Living`對象繼承自`Being`。 第一個是父對象,第二個是子對象。 ```ruby class Being def to_s "This is Being" end def get_id 9 end end ``` 這是自定義 Ruby 對象的定義。 定義位于`class`和`end`關鍵字之間。 在定義內部,我們創建兩個方法。 當`puts`方法將對象作為參數時,它將調用其`to_s`方法。 它通常給出對象的字符串表示/描述。 ```ruby class Living < Being def to_s "This is Living" end end ``` 我們創建`Living`對象的定義。 該對象繼承自`Being`對象。 `<`運算符用于創建繼承關系。 `to_s`方法被覆蓋。 ```ruby l = Living.new ``` 從上面的`Living`對象模板,我們創建`Living`對象的實例。 使用`new`關鍵字創建自定義對象的實例。 ```ruby puts l ``` `puts`方法調用`Living`對象的`to_s`方法。 如果`Living`類中未定義`to_s`方法,則將調用`Being`類中的`to_s`方法。 ```ruby puts l.get_id ``` `Living`對象未定義`get_id`方法。 在這種情況下,將檢查父類是否存在這種方法。 在我們的情況下,`Being`方法具有這種方法,因此被稱為。 ```ruby puts l.is_a? Being ``` 該行返回`true`。 `Living`是`Being`的一種; 例如它繼承自`Being`類。 ```ruby puts l.is_a? Object puts l.is_a? BasicObject ``` 對于我們的`Living`自定義對象,我們沒有明確指定與`Object`或`BasicObject`對象的任何關系。 但是這兩行返回`true`。 這是因為 Ruby 中的每個對象自動都是這兩個對象的后代。 這是由 Ruby 解釋器在后臺完成的。 ```ruby $ ./custominher.rb This is Living 9 true true true ``` Output of the example. ## Ruby 頂級 Ruby 有一個特定的對象,稱為 Ruby 頂級。 這是在任何其他上下文(例如類或模塊定義)之外定義的默認執行環境。 頂級名稱為`main`。 它是`Object`類型的實例。 有一個與`main`關聯的局部空間,所有局部變量都駐留在該空間中。 ```ruby #!/usr/bin/ruby n1 = 3 n2 = 5 puts local_variables Kernel.puts self puts self.class ``` 這是描述 Ruby 頂層的第一個示例。 ```ruby n1 = 3 n2 = 5 ``` 在這里,我們定義了兩個數值變量。 這些變量是本地變量。 ```ruby puts local_variables ``` 在這里,我們列出了所有局部變量。 `local_variables`是`Kernel`模塊的一種方法,已混入每個`Object`(包括頂層對象)中。 ```ruby Kernel.puts self ``` `self`是 Ruby 偽變量。 它返回當前的對象接收者。 該行將`"main"`打印到控制臺。 它是 Ruby 頂層的名稱。 `Kernel.puts`代碼的`Kernel`部分可以省略。 通過完全指定名稱,我們顯示`puts`方法屬于`Kernel`模塊。 ```ruby puts self.class ``` 該行顯示頂層的`class`。 我們得到頂層的對象類型。 它是`Object`,它是 Ruby 類層次結構的根。 ```ruby $ ./toplevel.rb n1 n2 main Object ``` 這是示例的輸出。 `n1`和`n2`是與頂層關聯的局部變量。 主要是為 Ruby 頂級執行環境指定的名稱。 最后,`Object`是頂層的類型。 我們將有另一個與 Ruby 頂層相關的示例。 ```ruby #!/usr/bin/ruby @name = "Jane" @age = 17 def info "#{@name} is #{@age} years old" end puts self.instance_variables puts self.private_methods.include? :info puts info ``` 我們顯示了屬于頂級環境的實例變量和方法。 ```ruby @name = "Jane" @age = 17 ``` 我們定義了兩個實例變量。 實例變量以 Ruby 中的`@`字符開頭。 實例變量屬于特定的對象實例。 在這種情況下,它們屬于 Ruby 頂級。 ```ruby def info "#{@name} is #{@age} years old" end ``` 這是一個方法定義。 每個方法必須屬于某個對象。 此方法屬于頂級對象。 所有頂級方法都是私有的。 私有方法的訪問受到限制。 ```ruby puts self.instance_variables ``` `instance_variables`方法打印出`self`的所有實例變量,在此上下文中指向 Ruby 頂層。 ```ruby puts self.private_methods.include? :info ``` 所有頂級方法都是自動私有的。 `private_methods`返回對象的所有私有方法。 由于方法很多,我們調用`include?`方法來檢查`info`方法是否在其中。 請注意,我們通過符號名稱來引用`info`方法。 ```ruby $ ./toplevel2.rb @name @age true Jane is 17 years old ``` 示例輸出。 本章介紹了 Ruby 語言中對象的一些基礎知識。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看