Ruby语法基础(二)

继续ruby的学习,这次主要把目光放到运算符,条件判断,循环,方法,以及其他ruby特有的基本概念上

运算符

  • 算术运算符:+,-,/,%,**,值的注意的是,ruby中一切皆为对象,a+b等价于a.+(b)
  • 比较运算符:基本与Python的一致,不等于要用!=,还有联合运算符<=>,返回-1,0,1。.eql?判断数据值是否相等以及数据类型是否相等。equal?判断两个对象的id是否相等
  • 赋值运算:与Python一致,可以用a, b, c = 10, 20, 30并行赋值,交换也可以直接运行
  • 位运算:与Python一致,对二进制位操作,支持&, |,^,~(取反),<<,>>
  • 三元运算符: ? :
  • 范围运算符: 两个.包含结尾位置1..3(1,2,3);三个点不包括结尾1…3(1,2)
  • defined?:判断是否已经定义
foo = 42; $VAR = 1
# 1.判断变量是否已经初始化
puts defined? foo # local-variable
puts defined? $VAR # global-variable
puts defined? bar # 未定义
# 2.判断方法是否已经定义
puts defined? puts # method

条件判断

if…else

x = 1
if x>2
puts 'x > 2'
elsif x<=2 and x!=0
puts 'x = 1'
else
puts 'unknow x'
end

if修饰词

if后的条件成立才执行前面一句(比较灵活的写法)

a = 1
print a if a # 变量a被定义过了,所以返回true

unless

与if刚好相反

case

age = 5
case age
when 0..2
puts '婴儿'
when 3..6
puts '小孩'
when 7..12
puts '少年'
else
puts '其他'
end

循环

while

i = 0; num = 5
while i<num
puts i; i += 1
end

while修饰符

i = 0; num = 5
begin
puts i; i += 1
end while i<num

until

until与while完全相反

for

for i in 0..5
if i == 2
next # 相当于continue
elsif i == 4
break # 跳出循环
end
puts i
end

方法

  • 方法名必须以小写开头,否则会被当成常量
  • Ruby 中的每个方法默认都会返回一个值。这个返回的值是最后一个语句的值
  • return 语句用于从显示从方法中返回一个或多个值
def test(a=1, b) # 可以使用默认参数
return a+b, a-b
end
sum, sub = test 2, 3
puts sum, sub
  • 不定长参数
def sample (*test) # *号允许可变数量的参数
test.each do
|item|
puts item
end
end
sample 'a', 'b'
sample 1, 2, 3
  • 类方法

class Accounts
def reading_charge
# dosomething
end
def Accounts.return_date
# 类方法
end
end
Accounts.return_date # 类方法调用
  • alias可以重命名
alias 方法名 方法名
alias 全局变量 全局变量
  • undef取消定义
undef 方法名

块在ruby中用{}包裹,也可以用do end形式

# 定义函数
def myloop
while true
yield
end
end num = 1
# 执行myloop函数时,会把块中内容挂载到yield处
myloop do
puts "num is #{num}"
break if num > 100
num *= 2
end
# 运行结果
num is 1
num is 2
num is 4
num is 8
num is 16
num is 32
num is 64
num is 128

传递参数

def total(from, to)
result = 0
from.upto(to) {
|num|
if block_given?
result += yield num
else
result += num
end
}
result
end
puts total 1, 3
puts total(1,3) { # total后一定要紧跟括号
|num|
num ** 2
}

块本身也可以作为参数传递给函数(不实用yield方法)

# 块本身也可以作为参数传递给函数
def test(&block)
block.call
end test {
puts 'Hello World!'
}

模块

模块可以把方法、常量、模块组合在一起

  • 模块提供了一个命名空间,避免了名字冲突
  • 模块实现了mixin装置
  • 模块不能实例化
  • 模块没有子类
  • 模块只能被另一个模块定义

被引用的模块文件support.rb

module Support
PI = 3.1415926
def Support.hello(name) # 模块中的普通函数用模块名开头区分
puts "hello #{name}"
end
end module Week
FIRST_DAY = 'Sunday'
def Week.weeks_in_month
puts 'You have 4 weeks in a month'
end def Week.weeks_in_year
puts 'You have 52 weeks in a year'
end
end

main.rb

$LOAD_PATH << '.' # 添加搜索路径目录
require 'support' # 添加具体模块 # 调用模块方法
Support::hello 'ruby'
# 读取模块函数
puts Support::PI # 在类中引用模块内容要用include
class Decade
def initialize
@no_of_yrs = 10
end
# include Week
def no_of_months
puts Week::FIRST_DAY
number = @no_of_yrs * 12
puts number
end
end d = Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d.no_of_months #运算结果
hello ruby
3.1415926
Sunday
You have 4 weeks in a month
You have 52 weeks in a year
Sunday
120

mixins实现多重继承

support.rb

module A
def a1
puts 'a1'
end
def a2
puts 'a2'
end
end module B
def b1
puts 'b1'
end
def b2
puts 'b2'
end
end

main.rb

$LOAD_PATH << '.' # 添加搜索路径目录
require 'support' # 添加具体模块 class Sample
# 用 include方法把模块中的方法包含到类内
# 组装模块
include A
include B
def s
puts 's'
end
end s = Sample.new
s.a1 # 调用模块中的方法
s.a2
s.b1
s.b2
s.s

Ruby语法基础(二)的更多相关文章

  1. Ruby语法基础(三)

    Ruby语法基础(三) ​ 在前面快速入之后,这次加深对基本概念的理解. 字符串 ​ Ruby字符串可以分为单引号字符串和双引号字符串,单引号字符串效率更高,但双引号的支持转义和运行 puts '单引 ...

  2. Ruby语法基础(一)

    Ruby语法基础(一) Ruby是一种开源的面向对象程序设计的服务器端脚本语言,最初由松本行弘(Matz)设计开发,追求『快乐和生产力』,程序员友好型,被称为『human-oriented langu ...

  3. R语言语法基础二

    R语言语法基础二 重塑数据 增加行和列 # 创建向量 city = c("Tampa","Seattle","Hartford"," ...

  4. 3.ruby语法基础,全部变量,实例变量,类变量,局部变量的使用和注意的要点

    1.ruby的全局变量的概念和Java的全局变量的概念不同, ruby的全局变量是以$符号开头的,如果给全局变量的初始化值为nil会出现警告. 赋值给全局变量,这是ruby不推荐的,这样会使程序变得很 ...

  5. ruby基础(二)

    ruby语法基础 1.方法 方法时对象定义的与该对象相关的操作.在Ruby中,对象的所有的操作都被封装成 方法. 语法糖:语法糖是一种为了照顾一般人的习惯而产生的特殊语法. ruby中一切数据都是对象 ...

  6. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  7. java基础语法(二)--单列模式

    java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...

  8. Java03-Java语法基础(二)运算符

    Java语法基础(二)运算符 一.运算符 1.算数运算符:+.-.*./.% 1)双目运算符:二元运算符,参加运算的对象有两个(+.-.*./.%) 2)单目运算符:一元运算符,参加运算的对象只有一个 ...

  9. ruby之基础语法

    ruby语法之哈希 =>相当于python的字典 ruby语法之数组 =>相当于python的列表 举例: gitaly= Hash.new #建立新Hash类型 gitaly['firs ...

随机推荐

  1. Swap file ".hive-site.xml.swp" already exists

    1.使用命令[hadoop@slaver1 conf]$ ls -la查找出隐藏文件,然后删除报出来的错误文件. [hadoop@slaver1 conf]$ rm -rf .hive-site.xm ...

  2. [转] Nodejs 进阶:Express 常用中间件 body-parser 实现解析

    写在前面 body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析.使用非常简单,以下两行代码已经覆盖了大部分的使用场景. app.use(bodyParser ...

  3. python函数式编程——返回函数

    1.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 2.闭包 注意到返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还 ...

  4. md5爆破工具

    http://www.myhack58.com/Article/html/3/8/2015/65021.htm http://xlixli.net/?p=410 http://blog.csdn.ne ...

  5. Python学习(二十六)—— Django基础一

    转载自:http://www.cnblogs.com/liwenzhou/p/8258992.html 一.Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的 ...

  6. Codeforces 844F Anti-Palindromize 最小费用流

    Anti-Palindromize 想到网络流就差不多了, 拆拆点, 建建边. #include<bits/stdc++.h> #define LL long long #define f ...

  7. Openstack1 云计算与虚拟化概念

    一.云概念 二.虚拟化,云计算不等于虚拟化,但是云计算需要用到虚拟化的技术 1.服务器虚拟化 2.桌面虚拟化 3.应用虚拟化 三.区别 1.虚拟化是具体的技术. 2.云计算是交付使用的一种模式

  8. jquery对form表单复杂(多个)条件的判断验证

    //按钮先执行验证再提交表 $(document).ready(function(){ // 点击查看图片 $('.nyroModal').nyroModal(); //按钮先执行验证再提交表单 $( ...

  9. c#生成连续单号

    bill.BillCode = GetBillCode("JH");//生成单号 if (bill.BillCode == "no") { bill.BillC ...

  10. HashMap实现原理简析及实现的demo(一看就明白)

    HashMap底层就是一个数组结构,数组中的每一项又是一个链表. jdk源码: transient Node<K,V>[] table; static class Node<K,V& ...