zoukankan      html  css  js  c++  java
  • ruby基本语法(2)

    关于数组

    Ruby数组中的数据类型可以不相同并且长度也是可变的。(好聪明啊感觉用的久了就会变笨了,除非你本来就是老手)比如下面的例子

    Myarray=[1,2,“ruby”]

    Ruby也支持那种-1的表示,比如

    arry=[1,2,"ruby"]

    puts arry[-4]

    puts arry[-3]

    puts arry[-2]

    puts arry[-1]

    puts arry[0]

    puts arry[1]

    puts arry[2]

    puts arry[3]

    输出:

    1

    2

    ruby

    1

    2

    ruby

    注意这里的下标与实际内容的对应关系

    array nil     1    2    ruby    1     2     ruby     nil

    index –4   –3   -2     -1     0     1      2        3

    注意 ruby里面数组的下标也是从0开始的 数组中的第一个元素的index为0

    若是直接输出 ruby[0..-1]相当于把数组中的所有元素都输出来了从index=0d 一直输出到 index=无穷

    其他的一些创建数组的方式:
    #此种情况数组长度为0 不含任何元素 之后赋值的时候 数组长度会自发增加

    array=Array.new

    arry=[1,2,"ruby"]

    arry[10]="python"

    p arry[1..-1]

    输出

    [2, "ruby", nil, nil, nil, nil, nil, nil, nil, "python"]

    #先生成一个range在转化为数组,range也是ruby的一种数据类型,后面再介绍

    Range=1..9

    Array=range.to_a

    在Ruby的数组里 截取操作很灵活 有时候有点matlab的感觉

    arry="abcdefg"

    puts arry[0]

    #从索引为1开始截取,截取长度为3

    puts arry[1,3]

    #从索引为1开始截取,截取到索引为5,包含5号索引的值

    puts arry[1..5]

    #从索引为1开始,截取到长度为5,不包含该索引的值

    puts arry[1...5]

    输出

    a

    bcd

    bcdef

    bcde

    nil

    关于HashMap

    Hash对象可以被视为一种特殊的数组,只不过下标不是自然数了,而是自己根据实际情况定义的类型。

    Hash对象里的元素都是由两部分组成:key和value两个部分,Hash对象是由一些列在花括号里面的key-value对组成,多个key-value对之间以英文逗号隔开,key和value之间由"=>"隔开,最后一个逗号会被省略

    Hash中的一些语法:

    创建一个hash 用两个大括号即可 myhash={}

    或者看起来比较正规一点的 myhash=Hash.new

    my_hash = Hash.new("Trady Blix")

    这种方式创建hash的一个好处就是可以设置默认值 若是输入一个不存在的key则结果就不是空值(nil) 而是“Trady Blix ”

    添加一个hash其实是比较简单的 myhash[“key”]=value

    关于hash 删除的语法为movies.delete(key)

    注意后面没有感叹号

    .each迭代器可以对hash 或者数组里面的元素进行迭代

    下面是一个循环迭代的例子

    things = [[1,2,3], ["red", "blue"]]

    puts things[0][1]

    things.each do |sub_array|

    sub_array.each do |item|

    puts item

    end

    end

    对hash 进行迭代的话 需要两个相对应的变量

    restaurant_menu = {

    "noodles" => 4,

    "soup" => 3,

    "salad" => 2

    }

    restaurant_menu.each do |item, price|

    puts "#{item}: #{price}"

    end

    注意上面例子中 格式化输出时候 #{ } 形式进行的替换,这样会使输出的语法变简单,不用再进行字符串的拼接

    Ruby里面同一种功能总是有各种各样的实现方式,for…in表达式也可以对hash表对象进行迭代:

    myhash={"ruby"=>89,"Java"=>82,"python"=>85}

    for key,value in myhash

    #注意输出value值的时候要转化为string

    puts key+"=>"+value.to_s

    end

    注意设置hash默认值得方法 即使不论 key为什么 value全为默认值(这样所有的value的默认值被设置成了“nothing here”)

    h = Hash.new("nothing here")

    puts h

    # {}

    puts h["kitty"]

    若是取一个不存在的值得话 hash[“abc”] 则结果会返回一个nil 注意这个nil并不等于false

    False代表错误 而nil代表什么都不存在

    新玩意 Ruby Symbol

    ruby中有一种变量叫做符号变量,即symbol

    注意symbol的语法 总是在前面加一个冒号

    puts "string".object_id

    puts "string".object_id

    puts :symbol.object_id

    puts :symbol.object_id

    12218620

    12218400

    316648

    316648

    nil

    很显然 同样的两个“string”其实是不同的两个对象 而同样的两个:symbol其实是一样的东西

    一个Ruby的小例子:

    a="hello"

    b="hello"

    puts a.object_id

    puts b.object_id

    puts :a==:b

    symbola=:a

    puts symbola

    a="goodbye"

    puts a.object_id

    puts symbola==:a

    输出来结果如下:

    12139700

    12139680

    false

    a

    12138880

    true

    可以看出来 有几点

    1变量中同样的内容,不同的变量标识符,实际上是对应的不同的变量(objectid并不相同)

    2 同样的变量标识符,即使他们的内容不一致,只要标示符一样,转化过去之后对应的symbol变量就是一样的

    You can think of a Ruby symbol as a sort of name. It's important to remember that symbols aren't strings:

    sounds = {

    :cat => "meow",

    :dog => "woof",

    :computer => 10010110,

    }

    Symbols make good hash keys for a few reasons:

    1. They're immutable,meaning they can't be changed once they're created;

    2. Only one copy of any symbol exists at a given time, so they save memory;

    3. Symbol-as-keys are faster than strings-as-keys because of the above two reasons.(symbol作为key值 速度更快)

    Symbol作为hash的key值是很有效果的。因为它在内存中只有一份拷贝 一旦产生,就不再发生变化

    注意hash中每个key value元素之间都要加上“,”

    Symbol 与 string 是可以相互转化的

    :symbol.to_s可以将symbol转化为str

    String.to_sym 可以将str转化为symbol

    注意 这里如果a=string.to_sym只是将string转化为symbol之后将值传递给了a 但是string本事的值并没有发生改变 这里要特别注意一下

    strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]

    symbols=[]

    strings.each do |a|

    symbols.push a.to_sym

    end

    string 与symbols可以进行互相转化

    "hello".intern

    # ==> :hello

    .intern 与.to_sym 可以实现同样的功能

    However, the hash syntax has changed in Ruby 1.9. Just when you were getting comfortable!

    new_hash = { one: 1,

    two: 2,

    three: 3

    }

    虽然冒号放在了后面 但是前面的key值仍然是一个symbol

    Using .select to filter the hash

    We know how to grab a specific value from a hash by specifying the associated key, but what if we want to filter a hash for values that meet certain criteria? For that, we can use.select.

    grades = { alice: 100,

    bob: 92,

    chris: 95,

    dave: 97

    }

    grades.select {|name, grade| grade < 97}

    # ==> {:bob=>92, :chris=>95}

    正确代码:

    movie_ratings = {

    memento: 3,

    primer: 3.5,

    the_matrix: 5,

    truman_show: 4,

    red_dawn: 1.5,

    skyfall: 4,

    alex_cross: 2,

    uhf: 1,

    lion_king: 3.5

    }

    good_movies = movie_ratings.select{|k,v| v > 3}

    错误代码:

    good_movies={}

    good_movies=movie_ratings

    good_movies.select{|key,value| value >3}

    good_movies

    要注意 select后面与 { 之间不可以加空格 并且select仅仅是选择出来符合条件的key-value值 而并没有改变原来的 hansh表的值

  • 相关阅读:
    jquery 实现 返回顶部
    js 10秒倒计时 功能
    2019.6.10 工作日志
    2019.4.25 工作日志
    2019.4.22 工作日志
    2019.4.13 工作日志
    2019.3.12 工作日志
    2019.1.22 工作日志
    2019.1.18 工作日志
    2019.1.14 工作日志
  • 原文地址:https://www.cnblogs.com/Goden/p/3795162.html
Copyright © 2011-2022 走看看