Ruby语言介绍(二)——Ruby基本语法(语言基础)
模板:
主題:x
闡述:y
目錄
模板:
主題:參考文獻
主題:變量
主題:基本類型
主題:表達式
主題:賦值方式
主題:范圍
主題:散列表
主題:符號
主題:類型轉換
主題:參考文獻
闡述:因為最近ruby的熱度下降,因而出了RoR之外的其他領域似乎找不到足夠的資料。當然根本原因還是市場不夠(至少我是如此看待的)。
因此,此處主要參考的是一本出版于好久之前的書籍。
《Ruby on Rails程序設計 深入剖析與范例應用》
2013年五月第一版
主題:常量
闡述:所謂常量就是在程序運行過程中固定不變的量。ruby語言有自己的命名規則,從而可以方便的從名字上來判斷哪個變量時常量,哪個是白能量。
創建常量
Ruby是一種弱類型腳本語言,這意味著Ruby常量創建時無需指定特定數據類型。但是常量必須以大寫字母開頭。
Weekdays = 7在類似C#等強類型的編程語言中,常量一旦被定義,其值不會被改變。而且只可以對常量進行一次賦值。而在Ruby語言中,若對已定義的常量進行賦值,卻不會出現錯誤,而是出現警告信息。
mkdir ruby-exercise cd ruby-exercise vim hello.rbWords = "hello, world!" puts "#{Words}"ruby hello.rb測試hello.rb,成功
注意:在Ruby中常量只能定義在類、模塊和主程序中,而不能定義在方法中。
常量作用域
也可以在Ruby源文件中定義頂層常量,常量的作用域就是定義常量所在的類或者模塊的 的內部。還可以在該類的子類中訪問該常量。也可以在Ruby源文件中定義頂層常量,頂層常量可以在任意的地方引用它,這是因為定義的任何類、模塊和方法都位于頂層對象的內部。
class Parent # create parent classNAME = "somebody" # define constantputs NAME # visit constant inner parent classdef info # create methodputs NAME # visit constant in parent methodendclass TestParent # create inner classputs NAME #visit constant in inner classend end class Child < Parent # create child classputs NAME # visit constant in parent class end如果超出上面的范圍指定常量,則可使用“::”操作符來訪問。若想要準確地訪問任何頂層對象類中的變量,也需要使用“::”操作符。但是操作符左邊的限定類為空。
如果一個內部類還有一個父類,且父類和外部類中包含了一個同名的常量,則內部類將優先使用外部類中的常量。只有在外部類中找不到該常量時,才會使用父類中的常量。
主題:變量
闡述:無論在何種應用程序中,數據都必須以某種方式表示。除了常量,最常用的就是變量。按照作用域可以將Ruby中的變量分為局部變量和全局變量。
局部變量
變量是指用于容納一個值在內存中一塊專屬的存儲位置。用戶必須為每一個變量指定一個唯一的名稱,使用這個唯一的名稱訪問這個變量中存儲的值。
在Ruby語言中,為了與常量區分開來,局部變量必須以小寫的字母或者下劃線開頭。
局部變量可以定義在類內部、模塊內部或者方法內部,當對一個小寫字母開頭的變量進行賦值時,就創建了一個局部變量。該局部變量的作用域僅限于該類、該模塊或者該方法,一旦離開了局部變量的作用域,則該局部變量會自然消失。
Ruby中局部變量不可以在內部類和子類中訪問,深圳不可以在當前類的方法中被訪問。
class Parentstr = "Ruby";def showstrputs str; #在方法中訪問類的局部變量,出錯endclass InnerClassputs str; #訪問外部類中的局部變量,出錯end end class Child < Parentputs str; #訪問父類中的局部變量,出錯 end每個類和方法都可以認為是頂層對象的內部類和方法。所以即使定義了一個頂部局部變量。該變量的作用于是整個程序,但是在類、方法和模塊中,依然無法訪問該局部變量。
注意:在Ruby語言中的方法命名也是以小寫字母或下劃線開頭,如果方法沒有參數,還可以省略方法后面的括號。因此在程序中,必須仔細分辨到底調用的是方法還是局部變量。
全局變量
如果需要在方法中使用外部變量,則可以創建全局變量。Ruby語言中的全局變量時以“$”開頭的變量。
其實在Ruby任何地方都可以定義全局變量,如類、方法和模塊中。但是應該注意,雖然全局變量的定義域是全局,但實際上是從定義全局變量的語句開始,直到程序結束。如果引用尚未初始化的 全局變量,其值為nil。
Ruby語言還提供了一系列的全局變量,這些全局變量都具有特殊的含義。
ruby語言自帶的全局變量 $! 最近一次的錯誤信息 $@ 錯誤產生的位置 $_ gets最近讀的行數 $. 解釋器最近讀的行數 $& 最近一次與正則表達式匹配的字符串 $~ 作為子表達式組的最近一次匹配 $n 最近匹配的第n個子表達式 $= 是否區分大小寫標志 $/ 輸入記錄分隔符 $\ 輸出記錄分隔符 $0 Ruby腳本文件名 $* 命令行參數 $$ 解釋器進程ID $? 最近一次執行的子進程退出狀態主題:基本類型
闡述:數據類型時編程語言中對數據進行描述的定義,因為對于計算機不能識別數據,而不同數據間的相互運算在計算機內部的執行方式并不一樣,需要用戶顯定義數據的特性再進行其他操作,這里的特性就是數據類型。雖然Ruby是一門弱類型的語言,但是依然提供了豐富的基本數據類型。
數值類型
Ruby語言中的數值類型包括整數和浮點數。整數包括Fixnum和Bignum兩種類型,其中Fixnum類型可以容納比一個物理字長少一位的整數。當一個整數超過Fixnum范圍時,它會自動轉換成Bignum類型,而Bignum類型的取值范圍只能被物理內存所限制。
如果對一個Bignum類的數整數進行算術計算,最后的結果使得它可以用Fixnum類型保存,那么結果就會返回一個Fixnum對象。
調用使用class方法,可以查看當前變量的數據類型。
一個帶有小數點或指數的數字被認為是Float類型,數值中的下劃線將會被忽略。
字符串
在Ruby中字符串是任意順序的字節。通常,它們是一個字符序列。在Ruby中最簡單的就是使用單引號或者雙引號來指定一個字符串。
使用單引號的字符串會原樣輸出,而雙引號的字符串可以使用表達式。
除了使用單引號和雙引號之外,還可以使用%q來代替雙引號定義字符串。
運算符和表達式
運算符是一個特殊符號,可以接受一個或者多個變量(即操作數)作為輸入并返回值。運算符指定了要執行的操作類型。
Ruby提供了大量的運算符,根據運算符的作用,大致可以分為:賦值運算符、算術運算符、比較運算符、邏輯運算符、位運算符和三目運算符等。
賦值運算符
賦值運算符用于為變量指定變量值,Uzi常見的是“=”。
算術運算符
算術運算符是最簡單的,最常用的運算符,可以進行通用的數學計算。
+? -? *? /? %? **
比較運算符
比較運算符用于確定一個操作數與另一個操作數之間的關系,即進行比較運算。比較運算符的結果為布爾類型。取值為true或false。通常作為判斷或循環的條件。
>=大于等于
==等于
!=不等于
<=> 比較兩個對象,根據大于、等于或小于的情況,分別返回1,0和-1
=== 當左邊的對象是一個普通對象時,其與==作用相當,而當左邊的對象是一個Range對象時,右邊對象在Range內時,返回true,否則返回false
=~ 正則表達式配對
!~ 正則表達式不配對
邏輯運算符
邏輯運算符把多個操作數連接起來組成一個邏輯表達式,判斷某個表達式是否成立,結果是邏輯值。(true或false)
對于邏輯運算符,操作數必須是布爾類型,邏輯運算的結果也必須是布爾類型。
位運算符
位運算符主要用來讀操作數的二進制位進行運算,運算結果為一個整數。
& 按位進行與運算
| 按位進行或運算
^ 按位進行異或運算
~ 補碼運算
>> 右移位運算
<< 左移位運算
三目運算符
三目運算符又稱為條件運算符,之所以稱為三目運算符是因為該運算符需要3隔操作數。在編程過程中,使用該運算符可以計算一個條件,如果條件為真,就返回一個值;如果條件為假,就返回另一個值。
運算符優先級
級別
1? 邏輯運算符
2? 懲罰運算符
3? 加法運算符
4? 位運算符
5? 比較運算符
6? 位運算符
7? 邏輯運算符
8? 三目運算符
9? 賦值運算符
當表達式包含多個運算符時,運算符的優先級控制各運算符的計算順序。
主題:表達式
闡述:表達式是指一個或多個運算符合操作數共通作用以完成某項計算的組合。計算后的值通常是一個數,但也可以不是,參與運算的操作數可以是文本、常量、變量或者其他數據資源。
表達式的計算與使用方式是編寫程序的基礎。
一個表達式通常有兩部分組成,一部分是操作數,一部分是運算符。
當在一個表達式中同時存在多個運算符時,運算符的優先級決定了表達式的決定順序。,運算符的組合性決定了表達式的執行方向。
主題:賦值方式
闡述:
Ruby語言中為比變量或表達式賦值的方式更為靈活。
? 并行賦值:可以同時為幾個變量賦值,另外,并行賦值還可以分解可擴展數組。
嵌套賦值:對于嵌套賦值方式,可以認為是并行賦值中又嵌套了并行賦值。
使用嵌套賦值時,可以將左邊變量中的一些變量使用括號括起來,形成一個子并行賦值的變量列表。
主題:范圍
闡述:在其他編程語言中要表示一個范圍(Range)可能需要采用枚舉的方法來定義。
而Ruby提供了一種簡單的方式來定義。即只需定義兩個邊界。有如下兩種方式:
值1..值2:包括值1和值2 的方式以及中間的一系列值。
值1...值2:包括值1,但是不包括值2。
下面列出Range類的一些常用方法:
to_a:將該范圍轉換成一個數組;
include?(targetValue)/===(targetValue):判斷該范圍是否包含了targetValue;
min()/begin()/first():求該范圍的最小值;
max()/end()/last():求該范圍的最大值
除了使用方法之外,范圍對象還可以使用如下3個常用的迭代器方法:
reject:將該范圍轉換成一個數組,并剔除掉滿足條件的元素;
select:將該范圍轉換成一個數組,只選擇滿足條件的元素;
each:地帶范圍中的每個元素。
在范圍對象中,還可以定義字符范圍
a="a" .. "z" a.each do |i|print "當前元素為:" +i end主題:散列表
闡述:? 散列表是Ruby中的一種容器(Hash)對象,它包含的key可以是任意的元素,而不像數組必須是連續的整數。因此,通常情況下稱Hash對象為關聯數組對象或者字典對象。
定義散列表
每個Hash 對象由兩部分組成:key和value。key和value之間通過=>隔開,多個key-value之間通過,分隔開。
student={"name"=>"haoxy","age"=>22,"sex"=>"male" }即,所謂的Hash對象就是把任意對象當做索引來構造數組。
注:在Hash對象中,如果同一key指定了兩個值,那么后面指定 的值將會覆蓋前面的值。
每一個hash對象都是hash類的實例。因此可以通過創建hash類實例的方式來創建hash對象,創建hash對象后,動態添加元素。
student=Hash.new操作散列表
創建了散列表之后,通過Hash類的方法可以查看散列表的長度、刪除指定元素、獲取所有key 和獲取所有value等操作。如下為常用的方法:
size()? ? 返回Hash對象的大小
length()? ? 返回Hash對象的長度
include?(key)? ? 判斷指定的Hash對象是否包含指定的key
has_key?(key)? ? 判斷指定的Hash對象是否包含指定key
delete(key)? ? 刪除Hash對象中指定key的對應元素
keys()? ? 返回由Hash對象中全部key組成的數組
values()? ? 返回由對象中全部values組成的數組
遍歷散列表
在遍歷Hash對象元素時,使可以使用Hash對象的迭代器方法。Hash對象支持常用的四個迭代器:
each:迭代輸出Hash對象里全部元素(包括key和value)
each_key:迭代輸出Hash對象里的所有key
each_pair:迭代輸出Hash對象里的所有key-value對
each_value:迭代輸出Hash對象里所有value
注:在each迭代器中如果只使用一個參數,則該參數依次遍歷素有的key和value
主題:符號
闡述Ruby中符號更像一個字符串,因為其內部表現形式是一個字符序列,所以字符串與符號對象一一對應。但是與字符串不同,每個符號的實例只有一個,一個特定的對象名總是產生相同的符號對象,不論對象名在程序中如何被使用(不論對象的值如何變化,不論對象時方法還是一個標志符)。
符號對象時一個字符串、一個方法、一個類或一個標志服的內部表示形式。類似與對象的id,可以在對象名前加上一個:來創建符號對象。
:標志符
:變量名
:操作符
#下面代碼演示創建符號的方法 a=10 b=:a a="Ruby" c=:a puts b==c puts b==:"a" def showputs "Hello World" end d=:show put d=:"show"而上述代碼運行的結果如下:
true
true
true
從上述結果中可以得到一個結論:只要對象名相同,該對象總是產生相同的符號對象。因為字符串和符號對象之間一一對應,因此字符串和符號對象之間可以通過to_s和to_sym方法回想轉化。除此之外,每個符號對象都有唯一與之對應的整數值,這個整數值可以使用to_i方法獲得。
Ruby把系統中所有symbol對象都放在運行時維護的一個符號列表里,而這個符號列表是一個原子數據結構,其中存儲著當前所有的全局標識符,并且保證相同的標識符不會出現多個對象。幾乎每一種語言和系統都會有這樣一個符號表,只不過在C和Java等語言中,這個符號表只是在編譯時存在,運行時消失。而Ruby在運行時也保留這張符號表。
符號對象最常用的地方是用來代表變量名或者方法名。
如下為定義存儲器的代碼:
class Personattr_accessor :name end除此之外,還有另外一種創建符號對象的方式,稱為“%表示法”
book = "Ruby" a= :book b= %s{book} puts a==b結果為true
主題:類型轉換
闡述:所謂類型轉換就是指將一種數據類型轉換為另一種數據類型。Ruby提供了很多內置的方法用于數據的類型轉換,其中最常見的有以下方法:
to_s方法:轉換成字符串;
to_i方法:轉換成整數;
to_f方法:轉換成浮點數;
to_a方法:轉換成數組;
to_time方法:轉換成時間;
to_date方法:轉換成日期。
上述轉換方法不是所有對象都有,但是原理上都一樣,并且使用方法也基本相同。
在轉換過程中注意,Ruby不會自動將字符串轉換成整數。如果要轉換的整數沒有對應整數的情況會將數據轉換成0。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
總結
以上是生活随笔為你收集整理的Ruby语言介绍(二)——Ruby基本语法(语言基础)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kaggle:入门赛Tatanic(泰坦
- 下一篇: 分页插件Kaminari