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表的值
ruby基本语法(2)的更多相关文章
- Ruby的语法糖
发现Ruby的语法糖好多,比如函数调用,参数列表可以写括号和不写括号.代码块可以用do end 或者 {}. 还有 if,unless后置.等等. 如果看Ruby代码看多了,你会发现,它很多地方的 ...
- Ruby基本语法规则
1.Ruby常用数据类型 Numbers, Strings, Booleans my_num = 25 my_boollean = true (or false) my_string = " ...
- [ruby on rails] 深入(2) ruby基本语法
1. 调试&注释&打印输出 1.1 调试 ruby属于解释型语言,即脚本,在linux上,脚本的执行无非三种: 1. 用解释器运行脚本 解释器 脚本文件 即:ruby 脚本文件 2. ...
- ruby基础语法
首发:个人博客,更新&纠错&回复 学不同语言,常将它们的基础语法搞混,例如if后面有没有(),后面是then还是:还是{,结尾是end还是}. 这种事情毫无技术含量又毫无乐趣可言,但极 ...
- Ruby基本语法
更新: 2017/06/09 更新: 2017/06/20 cattr_accessor定义类变量,相当于@@ 更新: 2017/06/23 生成类的实例 更新: 2017/06/24 补充loop的 ...
- ruby基本语法(1)
一些学习资源 http://www.codecademy.com/zh/courses/ruby-beginner-en-d1Ylq/0/5?curriculum_id=5059f8619189a50 ...
- 关于Ruby常用语法案例累积
变量问题: 类变量和方法变量的区别是什么? 类变量:可以直接使用 方法变量:需要实例化后,才能使用该变量 案例一: class Person @@name = "Tom" @@na ...
- 2.ruby基本语法,类的定义
1.在ruby中的定义class,ruby中定义类也是以关键字class开头 后面带着类名,类名以大写开头.一个类的结束以关键字end 结束.如: class Customer end 2.ruby类 ...
- ruby puts语法
str = "Welcom to china" str1 = str puts str + " 1" puts str1 + " 1" de ...
随机推荐
- C# 同步调用 异步调用 异步回调 多线程的作用
同步调用 : 委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 异步调用 :同步调用会阻塞线程,如果是要调用一项繁重的 ...
- linux安装 rsync 客户端和相关权限认证
[root@rsync-client-inotify /]# yum install rsync -y [root@rsync-client-inotify /]# echo "redhat ...
- CentOS7 设置电源选项,待机、睡眠、挂起
设置装有 CentOS7 的笔记本合盖后黑屏进入睡眠模式 systemd 能够处理某些电源相关的 ACPI事件,你可以通过从 /etc/systemd/logind.conf 以下选项进行配置: Ha ...
- Message相关函数对比
SendMessage PostMessage 过程类型 同步过程:等待其他程序处理消息完了之后才返回,继续执行 异步过程:只把消息放入队列,不管其他程序是否处理都返回,然后继续执行 返回值 表 ...
- Vue自定义指令实现input限制输入正整数
directive.js import Vue from 'vue' export default () => { Vue.directive('Int', { inserted: functi ...
- map接口、hashmap常用方法
注意:map中键不能重复(是否重复是根据equals方法判断),否则新的会覆盖为旧的 范例: public class TestMap { public static void main(String ...
- crt无法修改背景
当会话选项 里面的终端类型选择为Linux时,是无法修改外观颜色方案的.可以选择为vt100,就可以修改颜色了
- [BZOJ] 书堆
问题描述 蚂蚁是勤劳的动物,他们喜欢挑战极限?现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍.书是形状大小质量都一样的矩形.蚂蚁要把这些书摆在水平桌子的边緣.蚂蚁喜欢整洁的布置,所以 ...
- 【leetcode】712. Minimum ASCII Delete Sum for Two Strings
题目如下: 解题思路:本题和[leetcode]583. Delete Operation for Two Strings 类似,区别在于word1[i] != word2[j]的时候,是删除word ...
- 9:关于Maven工程的文件标识(定义java文件源码,资源文件)