1. 调试&注释&打印输出

1.1 调试

ruby属于解释型语言,即脚本,在linux上,脚本的执行无非三种:

1. 用解释器运行脚本

解释器  脚本文件

即:ruby  脚本文件

2. 直接运行脚本

在脚本文件里面用

#! 脚本解释器

定义好脚本解释器路径,然后再授予脚本执行权限,接着直接运行

./脚本文件

即可。

3. 在解释器里面运行脚本

root@tommy:/home/ywt/ror_tests/ruby_tests# irb
2.1.5 :001 > str = "sdfsdf"
=> "sdfsdf"
2.1.5 :002 > puts str
sdfsdf
=> nil
2.1.5 :003 > print str
sdfsdf => nil
2.1.5 :004 >

ps:建议直接用第一种,第二种比较麻烦,第三种比较难看(当然try语法可以用这个)

1.2 注释

coment.rb

#single line comment
str = 'hello world'
=begin
this is a test of
mutiple line comments
=end
puts str

测试输出如下:

root@tommy:/home/ywt/ror_tests/ruby_tests# ruby comment.rb
hello world

即:

#单行注释
=begin
多行注释
=end

1.3 打印输出

print_test.rb

str ='hello world'
puts str
print str
puts ' ========='

测试输出

root@tommy:/home/ywt/ror_tests/ruby_tests# ruby print_test.rb
hello world
hello world =========

即:

puts  str  =  print str  + print new_line

(new_line在windows下面是 '\r\n' ,linux上面是 '\n')

2类

2.1 一般定义

class Aclass
end

注意:类名的第一个字母必须大写!(python则无此要求)

2.2 继承的一般定义

class Child<Father
end

即继承符为'<';

问题:是否支持多继承?

2.3成员

2.3.1 成员变量

attr_accessor :成员变量

例如Cat类的定义

class Cat
attr_accessor :name
attr_accessor :age
attr_accessor :sex
def to_s
"#{@name},age #{@age},#{@sex}"
end
end c = Cat.new
c.name='ruby'
c.age=1
c.sex='female'
puts c

  

测试:

root@tommy:/home/ywt/ror_tests/ruby_tests# ruby class_cat.rb
ruby,age 1,female

  

2.3.2 成员函数

成员函数定义

def method
codes
data
end

最后的data是返回的数据,可以不用写return ; codes是实际的代码。

问题,成员函数如何接受参数?直接定义就好了,如下:

def method(arg1,arg2,arg3...)
codes
data
end

对于返回值为bool类型的函数,可以如下定义

def method?
codes
true/false
end

2.3.3 构造函数

def initialize(arg1,arg2,arg3..)
codes
end

  

例如上面的Cat类,改造如下:

class Cat
attr_accessor :name
attr_accessor :age
attr_accessor :sex
def initialize(name,age,sex)
@name = name
@age = age
@sex = sex
end def to_s
"#{@name},age #{@age},#{@sex}"
end def say_hi(name)
puts 'hi '+name
end
end c = Cat.new('ruby',1,'female')
puts c
c.say_hi 'alice'

测试输出:

root@tommy:/home/ywt/ror_tests/ruby_tests# ruby class_cat.rb
ruby,age 1,female
hi alice

2.3.4 类变量&self操作符

@@类变量

类属性定义如下,需要有self操作符:

def self.类变量
@@类变量
end

demo如下:

class Pro
@@name1 = 'color'
def self.name2
@@name1
end
end puts Pro.name2

测试:

root@tommy:/home/ywt/ror_tests/ruby_tests# ruby test_property.rb
color

self,类似于python里面的self,指向当前的变量实例。不同的是ruby的self可以用在修饰类属性上。

3. 数据类型

3.1 字符串

定义

"字符串"

单引号,原始字符串(类似于python中 r'字符串',c#中 @'字符串'),之所以这样,因为它是literal by literal方式的显示。

'字符串'

demo:

2.1.5 :006 > x = 12
=> 12
2.1.5 :007 > puts "x = #{x}"
x = 12
=> nil
2.1.5 :008 > puts 'x=#{x}'
x=#{x}
=> nil

常用函数: upcase /downcase /reverse/count, demo如下

2.1.5 :010 > str = "an apple a day keeps the doctor away"
=> "an apple a day keeps the doctor away"
2.1.5 :011 > puts str.upcase
AN APPLE A DAY KEEPS THE DOCTOR AWAY
=> nil
2.1.5 :012 > puts str.capitalize
An apple a day keeps the doctor away
=> nil
2.1.5 :013 > puts str.size
36
=> nil
2.1.5 :014 > puts str.count "an"
7
=> nil
2.1.5 :015 > puts str.upcase!
AN APPLE A DAY KEEPS THE DOCTOR AWAY
=> nil
2.1.5 :016 > puts str
AN APPLE A DAY KEEPS THE DOCTOR AWAY
=> nil
2.1.5 :017 > puts str.downcase
an apple a day keeps the doctor away
=> nil
2.1.5 :018 > puts str.reverse
YAWA ROTCOD EHT SPEEK YAD A ELPPA NA
=> nil

官方参考文档:http://ruby-doc.org/core-2.1.5/String.html  

 

3.2 数值

三种类型:Fixnum/Bignum/Float ,如下:

2.1.5 :029 > 100.class
=> Fixnum
2.1.5 :030 > 100000000000000.class
=> Bignum
2.1.5 :031 > 1.0.class
=> Float

默认的类型转换

num op  Float = Float

num op num = num

Float op  Float = Float

op指: +-*/ % , 如下:

2.1.5 :035 > (1+2.0).class
=> Float
2.1.5 :036 > (1/100).class
=> Fixnum
2.1.5 :037 > (2.0/2.0).class
=> Float

常用函数:

整形:odd,even,abs

浮点型:round, numerator(分子部分), denominator(分母部分数值)

2.1.5 :038 > 11.odd?
=> true
2.1.5 :039 > 11.even?
=> false
2.1.5 :040 > -12.abs
=> 12
2.1.5 :041 > 12.12341234.round(2)
=> 12.12
2.1.5 :042 > 0.75.numerator
=> 3
2.1.5 :043 > 0.75.denominator
=> 4

更多api请看这里:http://ruby-doc.org/core-2.1.5/Integer.html

3.3 数组

2.1.5 :077 > arr=["adsad",1,2,3,"21123",123.123]
=> ["adsad", 1, 2, 3, "21123", 123.123]
2.1.5 :078 > puts arr
adsad
1
2
3
21123
123.123
=> nil
2.1.5 :079 > arr[-1]
=> 123.123
2.1.5 :081 > arr[2,4]
=> [2, 3, "21123", 123.123]
2.1.5 :082 > arr[2..4]
=> [2, 3, "21123"]
2.1.5 :091 > def ret_arr
2.1.5 :092?> return 1,2,4
2.1.5 :093?> end
=> :ret_arr
2.1.5 :094 > ret_arr
=> [1, 2, 4]

  

元素支持任何类型,可以通过arr[index]方式进行索引(index可以为负),支持切片,支持不带括号返回数组。

行为跟python的数组极其相似。

常用方法:map(支持写入 map!),each,select(等同于python里面的filter,map跟python里面的map等同),find_all(间接等于select)

2.1.5 :158 > names = ['alice','Bob','carl','dMitri']
=> ["alice", "Bob", "carl", "dMitri"]
2.1.5 :160 > puts names.map{|n| n.capitalize}
Alice
Bob
Carl
Dmitri
=> nil
2.1.5 :162 > names.each{|n| puts "#{n} is here"}
alice is here
Bob is here
carl is here
dMitri is here
=> ["alice", "Bob", "carl", "dMitri"]
2.1.5 :171 > arr.map{|n| n*2+5}
=> [7, 9, 11]
2.1.5 :172 > arr.find_all {|n| n>2}
=> [3]

 2.1.5 :176 > arr.select {|n| n>2}
   => [3]

更多用法参考这里:http://ruby-doc.org/core-2.1.5/Array.html

3.4 哈希类型(键值类型)

跟python里面的dict是一个概念。

定义方法:

{:var1 => val1 , var2 => val2 ,...}

也可以这样定义:

{var1:val1, var2,val2, ...}

php风格和python风格。demo如下

2.1.5 :100 > d = {name:'jone', age:38}
=> {:name=>"jone", :age=>38}
2.1.5 :101 > puts d[:name]
jone
=> nil
2.1.5 :103 > d[:name]="alice"
=> "alice"
2.1.5 :105 > puts d
{:name=>"alice", :age=>38}
=> nil
2.1.5 :106 > d.has_key?(:name)
 => true

感觉使用起来没有python顺手。

3.5 总结

数据类型的设计上比较简洁: 整形/浮点型/数组/哈希类型

所有的数值都是对象。拥有对象的方法。

4. 流程控制

4.1 条件跳转

if & unless

if condition
elseif condition
else
end
unless condition
end

unless = if not

case

case var
when val then codes
else codes
end

demo

2.1.5 :121 > x=1
=> 1
2.1.5 :122 > case x
2.1.5 :123?> when 3 then puts 'X is three'
2.1.5 :124?> when String then puts "X is a string"
2.1.5 :125?> when 0..2 then puts "X is 0, 1 or 2"
2.1.5 :126?> else puts "X is something else"
2.1.5 :127?> end
X is 0, 1 or 2
=> nil

4.2 循环

while/until

while/util condition
codes
end

times loop

执行num次

num.times do
codes
end

没有for/foreach

5 数组/哈希类型遍历

5.1 数组遍历

数组.each do |当前index对应的变量别名|
codes
end

或者

数组.each{|当前index对应的变量的别名| codes}

或者

数组.map{|当前index对应的变量的别名| codes} #不改变原数据
数组.map!{|当前index对应的变量的别名| codes} #改变原数据

5.2 哈希遍历

哈希类型变量.each do |key的别名, value的别名|
codes
end

demo

2.1.5 :144 > arr=[1,2,3]
=> [1, 2, 3]
2.1.5 :145 > dict={name:'john',age:38}
=> {:name=>"john", :age=>38}
2.1.5 :146 > arr.each do |v|
2.1.5 :147 > puts v+1
2.1.5 :148?> end
2
3
4
=> [1, 2, 3]
2.1.5 :155 > dict.each do |k,v|
2.1.5 :156 > puts "#{k} is #{v}"
2.1.5 :157?> end
name is john
age is 38
=> {:name=>"john", :age=>38}

[ruby on rails] 深入(2) ruby基本语法的更多相关文章

  1. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  2. Ruby on Rails (ROR)类书籍

    Ruby on Rails (ROR)类书籍下载地址及其他(整理) Ruby on Rails 如此之热,忍不住也去看了看热闹,现在把一些相关的电子图书下载地址整理下,方便有兴趣的朋友. 2006-0 ...

  3. 【Ruby on Rails学习二】在线学习资料的整理

    由于工作任务重,时间紧,没有太多学习的时间,大致找了些在线学习资料,这里做个整理,希望对同样准备学习的朋友有帮助 在线文档类: Ruby on Rails 实战圣经  使用 Rails 4.2 及 R ...

  4. 如何从 0 开始学 ruby on rails (漫步版)

    如何从 0 开始学 ruby on rails (漫步版) ruby 是一门编程语言,ruby on rails 是 ruby 的一个 web 框架,简称 rails. 有很多人对  rails 感兴 ...

  5. 如何从 0 开始学 Ruby on Rails

    如何从 0 开始学 Ruby on Rails (漫步版)Ruby 是一门编程语言,Ruby on Rails 是 Ruby 的一个 web 框架,简称 Rails. 有很多人对 Rails 感兴趣, ...

  6. (转) 如何从 0 开始学 ruby on rails (漫步版)

    原文:http://readful.com/post/12322300571/0-ruby-on-rails ruby 是一门编程语言,ruby on rails 是 ruby 的一个 web 框架, ...

  7. Ruby On Rails 路径穿越漏洞(CVE-2018-3760)

    Ruby On Rails在开发环境下使用Sprockets作为静态文件服务器,Ruby On Rails是著名Ruby Web开发框架,Sprockets是编译及分发静态资源文件的Ruby库. Sp ...

  8. Ruby系列教程(附ruby电子书下载)【转】

    摘要:http://www.cnblogs.com/dahuzizyd/category/97947.html 关键字:Ruby On Rails ,InstantRails,Windows,入门,教 ...

  9. 为什么学习Ruby On Rails:

    简单总结了一下自己为什么喜欢ruby on rails: 语法简单,写代码很愉快,比较接近伪代码: 喜欢其强大的正则表达式和字符串操作. ruby中面向对象更自由,更动态: ruby给人信任,相信你了 ...

随机推荐

  1. asp+mysql__不同类型用户登录

    未防注入//0.0 /***这里代码应用场景为多类用户登录,根据用户选择不同的单选按钮判断用户登录的类型,*从而进行不同的数据表进行判断,用户的用户名和密码是否正确.*/ public partial ...

  2. webkit的一些不为人知的高级属性

    1.-webkit-tap-highlight-color   tap按钮或者链接时,就会出现一个半透明的灰色背景,设置属性: -webkit-tap-highlight-color:transpar ...

  3. vertical-align0 垂直对齐- 图片 兼容个浏览器

    效果:  代码: <html> <head> <style type="text/css"> img.top {vertical-align:t ...

  4. Visual Studio无法查找或打开 PDB 文件解决办法

    Visual Studio无法查找或打开 PDB 文件解决办法 用VS调试程序时,有时会在VS底部的“输出”框中提示“无法查找或打开 PDB 文件”.这该怎么解决呢? 下面,我们以VS2013为例,来 ...

  5. JS判断是否是IE浏览器

    前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的. var ie = !+"\v1"; 仅仅需要7bytes!参见这篇文章,<32 bytes, ehr ... 9, ...

  6. php.ini中有关安全的设置

    php的默认配置文件在 /usr/local/apache2/conf/php.ini,通过为了使你的web更安全,我们需要对php.ini进行一些设置! (1) 打开php的安全模式 php的安全模 ...

  7. [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

    我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...

  8. c#之Redis队列在邮件提醒中的应用

    场景 有这样一个场景,一个邮件提醒的windows服务,获取所有开启邮件提醒的用户,循环获取这些用户的邮件,发送一条服务号消息.但问题来了,用户比较少的情况下,轮询一遍时间还能忍受,如果用户多了,那用 ...

  9. ssi技术

    html页面 <!DOCTYPE html> <html> <head> <title>测试ssi</title> <meta nam ...

  10. 如何获取客户端MAC地址(三个方法)

    方法一: 调用Windows的DOS命令,从输出结果中读取MAC地址: public static String getMACAddress() { String address = "&q ...