2.1 ruby語言入門
在第一章中,專案我們已經建立好並且能輸出第一個helloworld了,我們先不急著做專案,先了解一下ruby,只是需要看得懂程式碼。這一章我們簡單介紹一些ruby語言的語法。
1、執行程式的平臺,有三種方式執行ruby,第1種方法必須在專案資料夾下執行,第2、3種方法可以在任意資料夾下執行,前提是必須安裝ruby
(1)在控制檯中執行ruby
在寫專案的時候,建議用這個方法,因為我們之後做專案,在控制檯中可以直接呼叫專案中類方法和例項方法,測試很方便。
登入vagrant,開啟專案目錄,執行rails console(簡寫rails c)進入控制檯,輸入exit退出控制檯
vagrant@vagrant -ubuntu-trusty-64:/vagrant/data_system$ rails c
Running via Spring preloader in process 2659
Loading development environment (Rails 5.1.6.1)
irb(main):001:0> puts "hello world"
hello world
=> nil
irb(main):002:0> exit
(2)以irb互動的方式輸入程式碼直接執行
irb這個工具會隨著 Ruby 的安裝自動帶有,只需要在本地電腦命令列中鍵入 irb,就會進入互動式 Ruby。輸入exit退出互動模式。
xuzhaoning@xuchaoningdeMacBook-Air:~$ irb
2.2.1 :001 > puts "hello world"
hello world
=> nil
2.2.1 :002 > exit
(3)建立程式檔案,再在命令列執行此檔案
建立一個字尾為.rb的檔案,命名為first_project.rb,裡面寫上程式碼puts “hello world”
進入建立的這個程式檔案的目錄命令列上執行ruby first_project.rb,會輸出hello world。注意一定要在這個檔案的目錄下執行。
xuzhaoning@xuchaoningdeMacBook -Air:~$ ruby first_project.rb
#輸出資訊
hello world
2、ruby是面嚮物件語言
ruby是面嚮物件語言,面向物件的意思,顧名思義,就是對物件進行操作,在ruby裡面,想要建立一個物件,首先要建立類,然後呼叫new這個建構函式將類例項化,這個例項化之後的實體就是一個物件。
#咱們要對“車”進行例項化,先建立一個類Car
class Car
end
#然後建立車這個物件
car1 = Car.new
car1就是從Car這個類,通過new構造方法,來建立的物件。
初學者能對“物件”這個概念理解到這一層就可以了,語言本身就是將抽象的東西,用程式碼描述出來,來實現各種功能。要是想深入瞭解物件以及建構函式的工作,可以看《演算法第四版》這本書。建議初學者先跟著我學會ruby,再去看這本書。因為演算法比較難,你學會一門語言,再看演算法書會比較有代入感。
3、ruby類、模組
(1)通過class來定義一個類,類是抽象的,通過構造方法(new)才能將類變成一個例項。比如說我們之後建立一個論壇,定義一個Post類來代表帖子,post = Post.new來新建一個帖子,Post指的就是帖子這個一大類別,是抽象的,但是post是一個實際物件,指的是新建的這一個帖子,這個帖子有標題、內容等。類的命名規則用大寫字母開頭,多單詞組合時,每個單詞首字母大寫
(2)通過module來定義一個模組,模組是一種把方法、類和常量組合在一起的方式,模組和類用法差不多,命名規則與類是一樣的,但是模組不可以被例項化。如果你之前沒接觸過程式碼的話,肯定對這一段描述會很迷惑,不過沒有關係,咱們都會經歷這一個階段,等你程式碼寫的多了,自然而然就明白了。
#定義一個類,命名為Car
class Car
end
#定義一個模組,命名為BigCar
module BigCar
end
4、ruby方法
例項方法:是例項物件可以呼叫的方法。
類方法:是類可以直接呼叫的方法。
方法名命名規則:全部小寫,多個單詞用下劃線_隔開
#定義一個類,命名為MethodTest
irb(main):001:0> class MethodTest
#定義一個例項方法,命名為ins_method
irb(main):002:1> def ins_method
irb(main):003:2> puts "呼叫例項方法"
irb(main):004:2> end
#定義一個類方法,命名為cla_method,「self.方法名」就是類方法
irb(main):005:1> def self.cla_method
irb(main):006:2> puts "呼叫類方法"
irb(main):007:2> end
irb(main):008:1> end
=> :cla_method
#new是建構函式,MethodTest.new就是將MethodTest這個類例項化成一個物件,用例項物件才能呼叫例項方法
irb(main):009:0> MethodTest.new.ins_method
呼叫例項方法
=> nil
#不能用類直接呼叫例項方法,用MethodTest類直接呼叫例項方法會報錯
irb(main):012:0> MethodTest.ins_method
NoMethodError: undefined method 'ins_method' for MethodTest:Class
Did you mean? instance_method
from (irb):12
#cla_method是類方法,用MethodTest類直接呼叫就可以,不需要先將類例項化
irb(main):010:0> MethodTest.cla_method
呼叫類方法
=> nil
5、ruby變數、常量
(1)全域性變數:以$開頭。在整個程式中都可以訪問,全域性變數的值在程式中任何地方都可以修改。在實際專案中,一般不使用。
#定義一個全域性變數
$name = "xzn"
(2)例項變數:以@開頭,例項物件可以直接呼叫的變數。相同的變數對於不同的物件會有不同的值,只要物件還在,例項變數對應的值就不會消失。在實際開發中經常用到。
#建立一個名為Hello的類,在類中定義兩個方法initialize、set_name。
irb(main):001:0> class Hello
#initialize方法是類呼叫建構函式時執行的。Hello.new("Amy")會呼叫該方法,將@name賦值為"Amy"
irb(main):002:1> def initialize(myname)
irb(main):003:2> @name = myname
irb(main):004:2> end
#set_name是一個例項方法,通過例項(也就是物件)能夠呼叫這個方法,不能通過類直接呼叫,比如:Hello.set_name是錯誤的。
irb(main):005:1> def set_name
irb(main):006:2> puts "Hello,my name is #{@name}"
irb(main):007:2> end
irb(main):008:1> end
=> :set_name
#通過類呼叫new構造方法建立一個物件,命名為amy。將@name賦值為"Amy"
irb(main):009:0> amy = Hello.new("Amy")
=> #<Hello:0x00007f5901a07f88>
#通過amy這個物件,呼叫set_name例項方法,會輸出puts後面的語句,此時@name的值為"Amy"
irb(main):010:0> amy.set_name
Hello,my name is Amy
=> nil
#通過類呼叫構造方法再建立一個物件,命名為li_hua。將@name賦值為"LiHua"
irb(main):011:0> li_hua = Hello.new("LiHua")
=> #<Hello:0x00007f5901a2b348>
#此時@name的值為"LiHua"
irb(main):012:0> li_hua.set_name
Hello,my name is LiHua
=> nil
#再次用amy物件呼叫set_name方法,看一下@name例項變數,在不同的例項中,是否會相互影響。
#amy物件中@name的值是"Amy"。li_hua物件中@name的值是"LiHua",相同的變數對於不同的物件會有不同的值,不會相互影響。
irb(main):013:0> amy.set_name
Hello,my name is Amy
=> nil
(3)類變數:以@@開頭,所有例項可以共享的一個變數。
irb(main):001:0> class Hello
irb(main):002:1> def initialize(myname)
irb(main):003:2> @@name = myname
irb(main):004:2> end
irb(main):005:1> def set_name
irb(main):006:2> puts "Hello,my name is #{@@name}"
irb(main):007:2> end
irb(main):008:1> end
=> :set_name
irb(main):009:0> amy = Hello.new("Amy")
=> #<Hello:0x00007f5901a07f88>
irb(main):010:0> amy.set_name
Hello,my name is Amy
=> nil
irb(main):011:0> li_hua = Hello.new("LiHua")
=> #<Hello:0x00007f5901a2b348>
irb(main):012:0> li_hua.set_name
Hello,my name is LiHua
=> nil
#在上面@name例項變數例子中,相同的變數對於不同的物件會有不同的值,amy物件中,@name的值為“Amy”,
#lihua物件中,@name的值為“Lihua”。但是對於@@name類變數,@@name的值是被這個類例項化出來的物件共用的,當@@name的值為“Lihua”,那麼所有物件對應的@@name的值也變成了“Lihua”,主要對比例項變數例子中的區別。
irb(main):013:0> amy.set_name
Hello,my name is LiHua
=> nil
(4)常量:規定大寫字母開頭,實際開發中一般全部大寫,用來定義一個不可變的值。常量不可以定義在方法內。定義在類或模組中的常量,可以被類和模組內部訪問。定義在類或模組外的常量,可以被全域性訪問。
irb(main):001:0> class ConstantExample
#定義常量
irb(main):002:1> VAR1 = 100
irb(main):003:1> VAR2 = 200
#定義一個例項方法
irb(main):004:1> def put_var
irb(main):005:2> puts "第一個常量為#{VAR1}"
irb(main):006:2> puts "第二個常量為#{VAR2}"
irb(main):007:2> end
irb(main):008:1> end
=> :put_var
#例項化一個constant_example物件
irb(main):009:0> constant_example = ConstantExample.new
=> #<ConstantExample:0x00007f5901982950>
#通過例項化物件呼叫例項方法,輸出被定義的常量
irb(main):010:0> constant_example.put_var
第一個常量為100
第二個常量為200
=> nil
Ruby on Rails開發者文件
http://doc.rubyfans.com/