1. 程式人生 > >2.1 ruby語言入門

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”

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/