有趣的Ruby-學習筆記1

來源:互聯網
上載者:User

標籤:

Ruby類類定義
#!/usr/bin/rubyclass Sample   def hello      puts "Hello Ruby!"   endend# 使用上面的類來建立對象object = Sample. newobject.hello
注意 :無參數的函數調用可以省略()初始化方法初始化方法有一個統一的名字叫 initialize
class Customer   @@no_of_customers=0   def initialize(id, name, addr)      @cust_id=id      @cust_name=name      @cust_addr=addr   endend

Ruby變數ruby支援5種類型
  • 一般小寫字母、底線開頭:變數(Variable)。
  • $開頭:全域變數(Global variable)。
  • @開頭:執行個體變數(Instance variable)。
  • @@開頭:類變數(Class variable)類變數被共用在整個繼承鏈中
  • 大寫字母開頭:常數(Constant)。
變數(就是 局部變數)變數的列印變數在列印的時候不能省略 大括弧,別的類型變數都可以省略大括弧,比如你這樣列印變數是打不出東西的錯誤的寫法
a=1b=2puts "a: #a"puts "b: #b"
列印結果
a: #ab: #b
正確的寫法
a=1b=2puts "a: #{a}"puts "b: #{b}"
列印結果
a: 1b: 2
變數的生存周期變數的生存周期只在方法中,出了方法就沒了,所以也只能定義在方法裡面,比如錯誤的寫法
class Test2a=1b=2def printVar()puts "a: #{a}"puts "b: #{b}"endendhellotest = Test2.newhellotest.printVar()
輸出
test.rb:5:in `printVar‘: undefined local variable or method `a‘ for #<Test2:0x00000002cf2248> (NameError)        from test.rb:10:in `<main>‘
正確的寫法
class Test2def printVar(a,b)puts "a: #{a}"puts "b: #{b}"endendhellotest = Test2.newhellotest.printVar(1,2)
輸出
a: 1b: 2
變數的傳遞簡單類型是值拷貝(字串也是簡單對象,這點跟java不一樣)
class Test2def testPass(a,b)puts "before add : a: #{a}  b: #{b}"addVar(a,b)puts "after add : a: #{a}  b: #{b}"enddef addVar(a,b)a += 1b += 2endendhellotest = Test2.newhellotest.testPass(1,2)
輸出
before add : a: 1  b: 2after add : a: 1  b: 2
複雜物件是對象引用
class Obj1def initialize(a)@a=aenddef printVal()puts "a: #@a"enddef setA(a)@a=aenddef getA()return @aendendclass Test2def testPass()testobj = Obj1.new("hello")a = testobj.getA()puts "before add : a: #{a}"addVar(testobj)a = testobj.getA()puts "after add : a: #{a}"enddef addVar(obj)obj.setA(obj.getA() + " world")endendhellotest = Test2.newhellotest.testPass()
輸出
before add : a: helloafter add : a: hello world
執行個體變數執行個體變數的列印執行個體變數的列印是可以省略大括弧的,比如 #@a  跟 #{@a} 是一回事執行個體變數的生存周期執行個體變數只能在 initialize 裡面被定義。如果想像在java中這樣定義是錯誤的
class LearnInstanceVar@a=1def printVar()puts "a: #{@a}"endendtest1 = LearnInstanceVar.newtest1.printVar
輸出
$ ruby test.rba:
正確的定義
class LearnInstanceVardef initialize(a)@a=aenddef printVar()puts "a: #{@a}"endendtest1 = LearnInstanceVar.new("hello")test1.printVar
輸出
$ ruby test.rba: hello
類似java中的private,但是更嚴格,連定義的位置都只能放在特定的方法裡面

類變數類變數的列印類變數的列印是可以省略大括弧的,比如 #@@a  跟 #{@@a} 是一回事

類變數的生存周期
  • 類變數可以在多個執行個體之間公用,類似java的 static
  • 在類的方法體以外聲明
比如這樣定義和使用類變數
#!/usr/bin/rubyclass Customer  @@no_of_customers=0  def printCus()    @@no_of_customers += 1    puts "Total number of customers : #{@@no_of_customers}"  endendcust1=Customer.newcust2=Customer.newcust1.printCus()cust2.printCus()

 全域變數
  • 全域變數以$符號打頭
  • 全域變數可以在類與類之間共用

Ruby 運算子下面只說ruby比較特殊的一些運算子比較子== 和 equal?== 和 equal 跟java中定義的正好相反:
  • equal? 是比較兩個對象是否是同一個對象
  • == 是比較兩個對象是否相等
例子
a = "Ruby" # 定義一個字串對象b = "Ruby" # 雖然和a的內容相同,但是他們是不同的對象a.equal?(b) # false: a和b指向不同的對象a == b # true: 他們的內容是相同的

eq? 是 equal? 的縮寫<=>  聯合比較子這是一個神奇的運算子:聯合比較子。如果第一個運算元等於第二個運算元則返回 0,如果第一個運算元大於第二個運算元則返回 1,如果第一個運算元小於第二個運算元則返回 -1。=== 三等號
這個運算子更神奇:
通常情況下這中方式與==是一樣的,但是在某些特定情況下,===有特殊的含義:

  • 在Range中===用於判斷等號右邊的對象是否包含於等號左邊的Range;
  • Regex中用於判斷一個字串是否匹配模式,
  • Class定義===來判斷一個對象是否為類的執行個體,
  • Symbol定義===來判斷等號兩邊的符號對象是否相同。
例子:
(1..10) === 5 # true: 5屬於range 1..10/\d+/ === "123" # true: 字串匹配這個模式String === "s" # true: "s" 是一個字串類的執行個體:s === "s" # true 
.eql?如果接收器和參數具有相同的類型和相等的值,則返回 true。比如 1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。
並行賦值
a = 10b = 20c = 30
可以寫成這樣
a, b, c = 10, 20, 30
於是在java和c中很麻煩的變數交換,在ruby中可以很簡單的寫成
a, b = b, c
這樣的代碼
a=1b=2c=3a,b=b,cputs "a: #{a}"puts "b: #{b}"puts "c: #{c}"
執行結果為
$ ruby test.rba: 2b: 3c: 3

範圍運算子
  • 1..10 建立了一個從1 到10的範圍,並且包含10
  • 1...10 跟上面那個唯一的不同是不包含10
define? 運算子我們在別的語言中都見到過如何判斷變數是否被定義的方法,比如js的是否等於undefined,和php的isset,ruby專門為這種操作設計了一個運算子叫 define? 這個運算子不僅可以告訴你該變數是否定義還可以告訴你 變數的範圍defined? variable # 如果 variable 已經初始化,則為 True
比如
foo = 42defined? foo    # => "local-variable"defined? $_     # => "global-variable"defined? bar    # => nil(未定義)
還可以檢測方法是否定義了
defined? method_call # 如果方法已經定義,則為 True
defined? puts        # => "method"defined? puts(bar)   # => nil(在這裡 bar 未定義)defined? unpack      # => nil(在這裡未定義)

Ruby 點運算子 "." 和雙冒號運算子 "::"請記住:在 Ruby 中,類和方法也可以被當作常量。
您只需要在運算式的常量名前加上 :: 首碼,即可返回適當的類或模組對象。
如果未使用首碼運算式,則預設使用主 Object 類。
例子
MR_COUNT = 0        # 定義在主 Object 類上的常量module Foo  MR_COUNT = 0  ::MR_COUNT = 1    # 設定全域計數為 1  MR_COUNT = 2      # 設定局部計數為 2endputs MR_COUNT       # 這是全域常量puts Foo::MR_COUNT  # 這是 "Foo" 的局部常量 









有趣的Ruby-學習筆記1

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.