声明变量
ruby声明变量的方式像javascript一样 直接 变量名 = 值 即可 甚至比js更省事,连var 都不需要
name = "jack" six = 6 arr = ['apple','banana']
从以上可以看出 ruby 也是赋值的时候 确定了变量类型 不需要声明类型 这种叫 “鸭子类型”
但声明变量时 有一些小小的规则
常量: 全大写字母 例:SYSTEM_TYPE=3.2
变量: 不考虑@,@@ $等符号的话,小写字母开头 单词间用_间隔 例如: age,@color,is_created
声明类或者Module: 首字母大写,驼峰命名方式 例子: Apple,Human
函数名: 小写字母开头, 可以用 问号 感叹号或者等号作为结尾 例如: name,created!,color=
数据类型
Number
String
Bool
Array
Hash
class的写法
面向对象语言,class毫无疑问都是最重要的,Ruby中的任何变量都是object
具体规范
首字母大写
class开头 end结尾
文件名字和class名称一样 只是文件名全是小写 单词间隔用_
类在实例化的时候 会自动调用 initialize函数
类变量: @@name 作用域 所有的类实例都会共享这个变量
实例变量: @color 作用域 仅在实例自己可以使用
普通变量: 作用域仅在某个方法内
全局变量: $开头,可以在任意地方使用
class Apple def initialize @color #初始化对象的时候 实例的变量 end def color return @color # 类似实例变量的 getter方法 end def color= color @color = color # 类似实例变量的 setter方法 end end red_apple = Apple.new red_apple.color = 'red' puts red_apple.color #ruby class的魔法写法 class Apple # 相当于把实例变量的声明 getter setter一句话全部搞定了 attr_accessor 'color' end
输出函数
puts "hello world!!" p "hello world!!"
if 条件语句
a = 1 if a ==1 ... elsif a ==2 ... else ... end
case 分支语句
a = 1 case a when 1 then .... when 2 then .... when 3,4,5 then .... else ..... end
三元表达式 a==1?'one':'not one'
循环语句 for each
[1,2,3].each { |e| puts e} for i in [1,2,3] puts i end puts i # 两者几乎等价,但for声明的临时变量的作用域不仅局限在 for循环里,在外侧也可以使用 所以尽量使用 each
循环 while loop
# loop 循环 loop do break if 条件 end # while循环 begin end while 条件 # 两者也几乎是等价的,只不过判断条件的地方不一样
ruby的一些魔法
方法调用的最外侧括号可以省略 例如: puts('hello world!') 等价 puts 'hello world!'
函数最后一行默认是有return的
def color @color end #等同于 def color return @colol end
hash 最外面的{}在大多数情况下可以省略
Apple.create :name=>'apple',:color=>'red' # 等同于 Apple.create({:name=>'apple',:color=>'red'}) #等同于hash的另一种写法 Apple.create name:'apple',color:'red'
4.调用block
Apple.all.map { |apple| apple.name} # 等同于 Apple.all.map(&:name)
Module
Module可以用来提炼各种方法,然后供给其他class来使用
不能被new
可以被include
module中的self.xx方法可以被直接调用
module中的普通方法,需要被某个class include之后,有对应的class调用
module Tool # 这个方法无法直接运行 必须被某个class include之后 有对应的class调用 def show_tip "this is the tip" end # 这个方法可以直接通过Module的名字.来使用 如 Tool.say def self.say 'Hi this is module self func' end end Tool.say class Student include Tool end Student.new.shop_tip
元编程
['a','b','c'].each do | name | define_method "say_#{name}" do puts "hi , #{name}" end end
每个语言都多少有些动态改变代码逻辑的能力,但ruby的元编程能力是最强的,用起来也最顺手。