本文寫於 2020 年 5 月 6 日python
最近在 mac 上探索到了 homebrew 的使用方法,對 ruby 的興趣直線上升,因此來學一學。程序員
最近幾年確實你們一直在唱衰 Ruby,整個社區的生態確實也不如 python 那麼龐大,可是這都不妨礙 ruby 被稱做「快樂編程」。web
這幾年愈來愈強調語言的性能,可是 Ruby 的做者松本行弘卻認爲,人才是最重要的!編程
自看到第一眼後,我就深覺得同!數組
這其實就是一個價值觀的問題,人更值錢,那麼就應該儘可能節省人力;機器算力更值錢,那麼就應該用人力去優化程序,來節省機器的算力。ruby
可是國內的大環境你們也懂,人多爆了。數據結構
那麼天然而然,從上面的結論來看,Ruby 在國內就不會流行——iphone
Ruby 做爲多範式編程語言,真的很難協做;做爲解釋型語言,運行速度也是超級慢……編程語言
可不少人對於 Ruby 的評價仍然是:程序員的一把尖刀!函數
而且在 web 開發領域,不少大公司堅持在使用 Ruby,這足以說明 Ruby 的強大了!
def sayHelo puts "Helo World." end sayHelo
就這麼簡單,看起來還蠻像 python 的。可是咱們繼續深刻,就會發現,ruby 的語言真的使人溫馨。
傳參的函數
def sayHello(name) puts "Hello, #{name}." end
咱們還能夠提供一個默認值,就像這樣:
def sayHello(name = 'world') puts "Hello, #{name}." end
這樣,若是咱們不傳入參數,那麼就會自動將 world 賦給 name 變量。
Ruby 是一個純 OOP 語言,那麼天然開頭就要講 class 啦!
讓咱們來定義一個手機類:
class Phone def initialize(brand = '蘋果', name = '劉好', number = 15_527_782_945) @brand = brand @name = name @number = number end def call puts "#{@name}使用#{@brand}手機,撥打了#{@number}的號碼。" end end iphone = Phone.new iphone2 = Phone.new('三星', '王自如', 1123321)
你們從這裏就能看到,Ruby 的語言是多麼的像英語。
在這個類中咱們能夠看到有個@variable
,這個有什麼用呢?其實就是一種變量。
_
開始(只是習慣);@
(這是語法,不是習慣!);@@
;$
開始的。那麼如何改變實例變量呢?
使用attr_accessor
: 定義可存取對象的屬性。
class Game attr_accessor :price #, :name def initialize(name = "怪物獵人世界", price = 200) @name = name @price = price end end
此時 price 變量就是能夠改變的,name 就不能夠改變。
能夠利用respond_to?
來判斷一下(這個方法一下子會說):
mygame.respond_to?("name") # false mygame.respond_to?("price") # true
Phone.instance_methods(false)
這個方法,可讓咱們知道該類下,有什麼方法是咱們自定義的。
對於上面寫的Phone
類,輸出結果就會是:
call
就這麼簡單。
若是中間寫的是true
呢,則會顯示全部的方法,好比一些自帶的方法。
iphone = Phone.new iphone.respond_to?("call")
respond_to?
這個方法能夠判斷該對象是否擁有某個方法,能夠返回一個布爾值。
因此咱們一般能夠這麼用:iphone.respond_to?("call") && iphone.call
什麼???變量類型?
Ruby 不存在所謂的「基本類型」,好比int
/float
/char
/...
一切皆對象的原則被嚴格恪守!
什麼意思呢?
puts 1.to_s
to_s
天生的就是 1 的方法!
對於數據類型來講,Ruby 擁有:Number、String、Ranges、Symbols,以及 true、false 和 nil 這幾個特殊值,同時還有兩種重要的數據結構——Array 和 Hash。
別的類型其實沒太多好說的,都大同小異。
咱們從 Array 類型的方法,來體驗一下 Ruby 的靈活性!
games = ['魔獸世界', '塞爾達傳說', '金庸羣俠傳'] puts games
這個 games 的定義,若是你在 RubyMine 或者其餘強大的 IDE 中編寫,他就會告訴你,有更好的方式:games = %w[魔獸世界 塞爾達傳說 金庸羣俠傳]
這就是爲何 Ruby 不易協做,一千個程序員有一千種寫法與實現方法!
這是永遠的重點,正常編程中最爲經常使用的方法。
Ruby 能夠經過each
來遍歷數組,具體語法以下:
games.each do |game| puts "我喜歡#{game}" end
這個地方稍微提一句,我曾在某個地方看到過,寫單引號的程序最後會比寫雙引號的小(文件大小)。
可是這裏這種模板字符串的寫法,必需要雙引號。
帶上數組下標的遍歷
games.each_with_index do |game, i| puts "第#{i}個遊戲是#{game}" end
games.join(',')
,這個方法其實不少語言都有,能夠返回一個由逗號鏈接的、由數組每一個元素順序組成的字符串。
這個怎麼判斷呢???
很簡單,仍是運用respond_to?
。
怎麼用?
剛剛的each
方法就能夠!
games.respond_to?('each') && puts '這是一個數組!'
剛剛的一些示例代碼,應該能夠看出來一些套路。
接下來總結一下:
+
:字符鏈接<<
:字符帶入*
:字符循環a = "helo"; b = "world"; puts a + " " + b; # <<:字符帶入 a << b puts a puts b # 這個其實至關於 a = a + b # *:字符循環 a="A" puts a*4