byterat

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            54 隨筆 :: 0 文章 :: 15 評論 :: 0 Trackbacks

          最近一直在看Programming Ruby - 2nd, 先記錄下一些不熟悉的Ruby的基本語法和操作(熟悉的就不再記啦...)

          Ruby的命名:

          ??????局部變量?????????全局變量??????實例變量??????類變量??? ?????????常量和類名
          ==============================================================================
          ??????name????????????$debug?????? @name??????? @@total?????????? PI
          ??????fish_and_chips? $CUSTOMER??? @point_1???? @@symtab????????? FeetPerMile
          ??????x_axis????????? $_?????????? @X?????????? @@N?????????????? String??????
          ??????thx1138???????? $plan9 ????? @_???????????@@x_pos?????????? MyClass
          ??????_26???????????? $Global????? @plan9?????? @@SINGLE??????????JazzSong
          ==============================================================================


          數組:

          數組下標從0開始, 下標可以為負整數, 此時代表數組從最末端開始, 最末端索引從-1開始
          數組的元素可以是任何類型的對象實例,包括nil實例

          數組的初始化:
          a = [ 'ant', 'bee', 'cat', 'dog', 'elk' ]
          或者
          a = %w{ ant bee cat dog elk }

          訪問:
          a[0]????#返回"ant"
          a[1]????#返回"bee"?
          a[-1]???#返回"elk"
          a[-2]???#返回"dog"

          賦值:
          a = [ 1, 3, 5, 7, 9 ]
          a[1] = 'bat'???????#a = [1, "bat", 5, 7, 9]
          a[3]= 'cat'??????? #a = [1, "bat", "cat", 7, 9]
          a[3] = [ 9, 8 ]????#a = [1, "bat", "cat", [9, 8], 9]
          a[6] = 99??????????#a = [1, "bat", "cat", [9, 8], 9, nil, 99]

          a = [ 1, 3, 5, 7, 9 ]
          a[2, 2] = 'cat'???????????#a = [1, 3, "cat", 9]
          a[2, 0] = 'dog'???????????#a = [1, 3, "dog", "cat", 9]
          a[1, 1] = [ 9, 8, 7 ]?????#a = [1, 9, 8, 7, "dog", "cat", 9]
          a[0..3] = [ ]?????????????#a = ["dog", "cat", 9]
          a[5..6] = 99, 98??????????#a = ["dog", "cat", 9, nil, nil, 99, 98]


          哈希表:
          相當于Java中的Map
          具有"鍵值對"特性, key和value都可以是任何類型的實例

          哈希的初始化:
          h = Hash["a", 100, "b", 200]???? # {"a"=>100, "b"=>200}
          h = Hash["a" => 100, "b" => 200]?# {"a"=>100, "b"=>200}
          h = { "a" => 100, "b" => 200 }?? # {"a"=>100, "b"=>200}

          訪問:
          h.length = 2

          賦值:
          h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
          h.length????# 3
          h['dog']??? # "canine"
          h['cow']????# 'bovine'
          h[12]?????? #?'dodecine'
          h['cat'] = 99
          h?????????? #?{"cow"=>"bovine", "cat"=>99, 12=>"dodecine","donkey"=>"asinine", "dog"=>"canine"}


          代碼塊:
          代碼塊在ruby 中是以{} 和do end 來包圍起來的。通常如果是單行使用{} ,如果是多行使用do..end
          代碼塊可以接受參數, 參數用兩個豎線"|"符號來包含, 參數間用逗號","來分隔
          代碼塊被作為一個對象傳入method體中執行(如果代碼塊對象有參數, 則method體在執行代碼塊中的代碼前,需要對代碼塊對象的參數賦值)

          例如:

          def test(max)
          ???i1, i2 = 1, 1??????????# parallel assignment (i1 = 1 and i2 = 1)
          ???while i1 <= max
          ??????yield i1????????????# 也可以寫成yield(i1),?yield指令代表了代碼塊執行的位置, i1是method體中對代碼塊f進行了賦值
          ??????i1, i2 = i2, i1+i2
          ???end
          end

          test(1000) {|f| print f, " " }

          輸出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987



          又例如:
          [1,3,5,7].inject(0) {|sum, element| sum+element} # 輸出:16



          Method的聲明:

          一般格式是:
          ???def my_new_method(arg1, arg2, arg3)????# 3 arguments
          ??????# Code for the method would go here
          ???end

          方法名initialize是特殊的method, 它在類的new操作時被執行, 用于對類實例進行初始化操作:
          ???def initialize(name, &block)
          ??????@name, @block = name, block
          ???end

          如果需要方法返回一個值, 可以顯式使用return關鍵字, 也可以使用"默認最后一行返回值"形式:
          ???def meth_one
          ??????"one"????# 相當于 return "one"
          ???end

          如果method的聲明中最后的參數帶有"&"前綴(例如下例的&action), 則表示該參數接受的是代碼塊, 并且該代碼塊將被轉換為Proc對象, 最后被賦值給一個類實例變量,如:
          ???class JukeboxButton < Button
          ??????def initialize(label, &action)
          ?????????super(label)
          ?????????@action = action #代碼塊對象被賦值給一個類實例變量(即@action)
          ??????end
          ??????def button_pressed
          ?????????@action.call(self)
          ??????end
          ???end
          ???start_button = JukeboxButton.new("Start") { songlist.start }

          如果method的聲明中最后的參數帶有"*"前綴, 表示該參數接受的是0個或多個參數(即:可變長參數), 例如:
          ???def varargs(arg1, *rest)
          ??????"Got #{arg1} and #{rest.join(', ')}"
          ???end
          ???varargs("one")????????????????# "Got one and "
          ???varargs("one", "two")???????? # "Got one and two"
          ???varargs "one", "two", "three" # "Got one and two, three"

          如果method的方法名最后為字符"=", 表示該方法可為類實例變量賦值, 相當于Java中的setXXXX方法
          ???class Song
          ??????def duration=(new_duration)?? # 整個方法名為"duration="
          ?????????@duration = new_duration?? # @duration為類實例變量
          ??????end
          ???end
          ???song = Song.new("Bicylops", "Fleck", 260)
          ???song.duration???????# 260
          ???song.duration = 257 # set attribute with updated value
          ???song.duration???????#?257


          ???上例中的"duration="方法 相當于下面的: attr_writer :duration
          ???class Song
          ??????attr_writer :duration
          ???end
          ???song = Song.new("Bicylops", "Fleck", 260)
          ???song.duration = 257


          區間:

          兩個點創建一個"包含"區間
          1..10????#包含1和10
          'a'..'z'

          三個點創建一個除最后一個元素外的區間
          my_array = [ 1, 2, 3 ]
          0...my_array.length? # 相當于0..2

          區間可以通過to_a函數來轉換為數組
          a = (1..3).to_a?? # a = [1, 2, 3]


          區間的一些方法:
          digits = 0..9
          digits.include?(5)???????????????????# true
          digits === 5?????? ??????????????????# true
          digits.min???????????????????????????# 0
          digits.max???????????????????????????# 9
          digits.reject {|i| i < 5 }???????????#?[5, 6, 7, 8, 9]
          digits.each {|digit| dial(digit)}??? #? 0..9


          待續...


          posted on 2006-11-22 11:26 比特鼠 閱讀(420) 評論(0)  編輯  收藏 所屬分類: Ruby on Rails
          主站蜘蛛池模板: 新田县| 永修县| 台中县| 龙井市| 怀宁县| 盘山县| 周口市| 文水县| 商城县| 荣昌县| 墨江| 静海县| 丹阳市| 海安县| 华安县| 五莲县| 新余市| 肇东市| 襄汾县| 左权县| 土默特右旗| 宜都市| 开原市| 革吉县| 东兴市| 无锡市| 隆子县| 荃湾区| 孟津县| 怀柔区| 垫江县| 靖远县| 青阳县| 尼玛县| 临沭县| 巩义市| 武隆县| 日喀则市| 刚察县| 黄骅市| 吉林市|