Ruby(2): 基本语法上

表达式和变量: 这两点和其他主流的编程语言基本没有差别,这里直接跳过。 需要注意的是 ruby中 x=x+1 可以写成 x+=1 但是不支持 x++ , x-- 等一元运算符 比较运算符和表达式: 在ruby中可以直接在表达式中混合使用比较运算符,来实现如果满足某个逻辑则进行相应的表达式操作:

1 x = 10  
2 puts "x is ten" if x == 10   # x is ten

除了if关键字还可以使用unless,这个表示和if相反的:

1 x = 24
2 puts "You are not a teenager" unless age > 12 && age < 20  # You are not a teenager

表示某个数在两个数之间可以使用between,此时between的两个边界都包括:

1 x = 10  
2 puts "x is in the area" if x.between?(6, 10)   # x is in the area

  需要注意的特殊比较符号: x<=>y,该表达式如果 x==y,则返回0;如果 x > y,则返回1; 如果x<y,则返回-1 . 循环: 前面看到可以使用数字的times块来实现循环,可以有下面两种形式:

1 # 使用do end来包裹逻辑代码块
2 5.times do puts "test" end     # testtesttesttesttest
3 
4 # 使用{ }来包裹逻辑代码快
5 5.times {puts "test"}               # testtesttesttesttest

一般来说如果循环的逻辑代码是单行且较短的时候可以使用大括号的形式,而当多行的时候建议使用do end形式。

另外对于循环的时候需要知道当前循环数的时候,可以使用下面三种形式的迭代子:

1 1.upto(10) {|number| puts number}  
2 # 或者  
3 do |number| puts number end  
4 
5 #下面同样可以两种方式
6 10.downto(5) {|number| puts number}
7 0.step(50, 5) {|number| puts number} 

常量: 在Ruby中一般将常量命名成首字母大写的形式,一旦变量名首字母大写之后,虽然可以继续改变其值,但是ruby会给出相应的警告。其实类名也是首字母大写,某种程度上,类也可以看做是常量

字符串表达式:

1 puts "abc" * 5  # abcabcabcabcabc
2 puts 'x' > 'y'      # false
3 puts 'x' < 'y'      # true
4 # 如果想得到一个字符ASCII码的值,使用 ? :
5 puts ?A --> 65      #  (在ruby2.3.0中好像还是会输出字符)
6 如果想要知道某个ASCII码对应的字符,可以使用数字 .chr方法来将其转换为字符:
7 puts 65.chr --> A 

使用字符串插值:

 1 puts "This is a #{'bad ' *3} word" # This is a bad bad bad word   
 2 # 需要注意的是这一句整个必须用双引号括起来,而里面的bad则可以用单引号,双引号都可
 3 
 4 # 另外可以再插值中使用变量:
 5 x = 10
 6 y = 20
 7 # 如果想要输出 10 + 20 = 30
 8 # 直接输出的话,必须调用数字的 .to_s 方法,否则会报错:
 9 puts x.to_s + " + " + y.to_s + " = " + (x + y).to_s
10 # 而使用插值的话,输入为:
11 puts "#{x} + #{y} = #{x + y}" 

正则表达式与字符串操作: 替换: 最简单的字符串替换为:

1 "foobarbar".sub("bar", "foo")  #  foofoobar 

该方法只替换第一次遇到的,要替换所有使用 gsub. 当然sub、gsub方法都支持正则表达式,例如要替换字符串中的前两个字符为 hello,可以使用

1 x = "foobarbar"
2 puts x.sub(/^../, "hello")  # helloobarbar

用正则表达式进行迭代: 在字符串中进行迭代处理,scan函数是最好的:

1 x.scan(/./) do |letter| puts letter end 

其中scan的传入参数也是一个正则表达式,该函数会遍历字符串,找到匹配的字符并进行相应的处理 。 其中常见的正则表达式特殊符号有: \w(word) \d(digit) \s(space) ^(表开始) $(表结束) .(任意字符) \A(字符开始的锚) \Z(字符结束的锚)  (其中w/d/s的大写形式表示其小写形式取反)

1 # 例如找到下面字符串中的数字:  
2 "the car cost $1000 and that car cost $100".scan(/\d/) do |letter| puts letter end
3 # 会发现这时候是一个一个数字输出,这时就要用到 + 号表示一个或者多个了。
4 "the car cost $1000 and that car cost $100".scan(/\d+/) do |letter| puts letter end 

匹配查询: 如果只是想看下字符串是否有匹配的模式,可以使用如下面的方式:

1  # the string has no digits
2 puts "the string has no digits" unless "hello, this is a test" =~ /[0-9]/  

当然可以使用更强大的字符串match函数,该函数不需要用 // 指定正则表达式,会默认的把中间的字符串作为正则表达式,且有一个返回值,类似于java上的group。可以通过列表似的方式来访问:

1 puts "the string has no digits" unless "hello, this is a test".match('[0-9]')
2 x = "this is a test".match(/(\w+) (\w+)/)
3 x[0]    # this is
4 x[1]    # this
5 x[2]    #  is
6 x[3]    # nil 

数组: 初始化的时候不需要指定长度, 可以直接 a = []. Redis的数组越界访问元素不会报错,只是会返回 nil。 往数组加值: a << "word" 或者 a.push(123)  --- 这两种方法都是将元素放到数组末尾 将值弹出来 : a.pop (这时候弹出的是最后的元素) 数组是个先进先出的容器,但是这个pop明显是后进先出。得到数组长度使用的是 .length属性。(实际上Redis中数组或者字符串的长度获取length和size方法都可以) 可以使用join方法将数组中的元素组合成一个长的字符串,join方法可以不带参数当做属性用,也可以带一个参数表示组合成新的字符串之后用什么字符进行分割。

1 irb(main):013:0> a = [1, 2,3]
2 => [1, 2, 3]
3 irb(main):014:0> a.join
4 => "123"
5 irb(main):015:0> a.join('|')
6 => "1|2|3"

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构之路

Java中Class类详解、用法及泛化

Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI。这项信息纪录了每个对象所属的...

2646
来自专栏和蔼的张星的图像处理专栏

64. 合并排序数组 II 三指针+从后向前

合并两个排序的整数数组A和B变成一个新的数组。 注意事项 你可以假设A具有足够的空间(A数组的大小大于或等于m+n)去添加B中的元素。 样例 给出A =...

941
来自专栏HTML5学堂

JavaScript | 获取数组中的单词并统计出现次数

HTML5学堂(码匠):如何通过JavaScrip实现数组元素的查找?在一个数组当中,找到所有的单词,并统计每个单词出现的次数。 功能需求 在一个自定义数组...

3687
来自专栏Python小屋

Python对象特殊方法及其用法演示

Python类有大量特殊方法,实现不同的特殊方法后该类对象则会支持对应的运算符或内置函数,下面的对应关系表列出了大部分特殊方法: 方法功能说明__new__()...

3386
来自专栏待你如初见

Day08

1133
来自专栏余林丰

“不可变的对象”与“不可变的对象引用”

什么是不可变的对象呢?我们都知道String是不可变的,如果有涉及大量的字符串拼接我们最好不要用String,虽然我们在代码中可以这样写: String str...

1999
来自专栏数据结构笔记

python基础类型(三):可调用类型——函数和方法

在 python中所有的类型都是对象,即使是 int,float这些其他语言中的基础类型在 python中也是以对象的形式存在,函数和方法也不例外。

733
来自专栏Golang语言社区

【Golang语言社区】前端编程-javascript使用闭包模拟私有属性和方法

最近因为做了一个项目,其中涉及到了js私有方法,这个概念在其语言里面是很常见的,很多语言都有private这个关键字,只要在一个类的前面加上private就表示...

2899
来自专栏步履前行

Java基础系列---static关键字

  今天在和同事讨论的时候谈到了关于static的问题,正巧自己有一些忘记了,就特来学习一番。

864
来自专栏小二的折腾日记

day5(面向对象2)

502

扫码关注云+社区