20分钟体验Ruby:http://www.ruby-lang.org/zh_cn/documentation/quickstart/
安装:三种方式:源代码;rubyinstaller.exe;ruby.exe
运行:cmd->irb
-------------------------
简单示例:
1、
>puts “Hello World”
Hello World
=>nil //nil是Ruby的空值,puts命令返回nil
2、
>3*2
=>6
>Math.sqrt(9) //Math是自带的数据模块,模块:功能相同的函数放到同一个名称下。
=>3.0
>a = 3**2 //**是次方的意思。给变量a赋值。
=>9
3、
定义函数
>def h //定义函数
>puts "Hello World"
>end //函数结束
=>nil
调用函数,直接输入h或者h()。
------------
>def h(name) //添加入参
>puts "Hello #{name}!"
>end
------------
>def h(name = "defaultName") //为入参添加默认值
>puts "Hello #{name.capitalize}!" //使用入参的字符串值,并且首字母大写
>end
调用:h "world"或者:h
------------
4、
定义类
class Greeter
def initialize(name = "World")
@name = name //@name是实例变量
end
def say_hi
puts "Hello #{@name}!"
end
def say_bye
puts "Bye #{@name}!come back soon!"
def
end
使用类:
>Greeter.new("Pat")
=>#<Greeter:0x16cac @name="Pat">
>g.say_hi
--------
>g.name //compile error 面向对象,属性隐藏
--------
>Greeter.instance_methods //将打印所有方法,很多是继承自父类,如果不希望继承类的方法打印
>Greeter.instance_methods(false)
--------
respond_to是内置函数,用于测试对象对指定方法是否有反应
>g.respond_to?("name") //没有
=>false
>g.respond_to?("say_hi")
=>true
>g.respond_to?("to_s") //to_s是内置函数
=>true
--------
打印并改变类,ruby可以获取甚至改变属性名
>class Greeter //打开类
> attr_accessor :name //通过attr_accessor来改变属性,它会引入两个方法:name(读取变量 //的值);name=方法(为变量赋值)
>end
>g = Greeter.new("kity")
>g.respond_to?("name")
=>true
>g.respond_to?("name=")
=>true
>g.name="kity2"
>g.say_hi
=>Hello kity2!
------------------------
一大波代码...
#!/usr/bin/env ruby class MegaGreeter attr_accessor : names # Create the object def initialize(names = "World") @name = names end # Say hi to everybody def say_hi if @names.nil? puts "....." elsif @names.repond_to?("each") # @names is a list of some kind,iterate! @names.each do |name| puts "Hello #{name}!" end else puts "Hello #{@names}!" end end # Say bye to everybody def say_bye if @names.nil? puts "......" elsif @names.respond_to?("join") # Join the list elements with commas puts "Goodbye #{@names.join(", ")}. Come back soon!" else puts "Goodbye #{@names}. Come back soon!" end end end if __FILE__ == $0 mg = MegaGreeter.new mg.say_hi mg.say_bye # Change name to be "Zeke" mg.names = "Zeke" mg.say_hi mg.say_bye # Change the name to an array of names mg.names = ["a", "b", "c"] mg.say_hi mg.say_bye @Change to nil mg.names = nil mg.say_hi mg.say_bye end
存储文件:ri20min.rb,然后运行:ruby ri20min.rb
上面的代码中,使用each函数,它是一个可接受代码块的函数,它在迭代每一个元素时,会调用一次接受的代码块。代码块像是一个不需要命名的函数。
@names.each do |name| //很优美 puts "#{name}"
-----------------------
代码块
代码块用于处理比迭代列表更繁琐的工作,您可以用它来自动安装卸载或处理运行错误。真正做到让用户省心、放心。
使用@names.respond_to?("join")这风格称为“鸭子型”-它走起来像鸭子,叫起来像,就是鸭子。
-------------------------
if __FILE__ == $0
__FILE__存有现在运行的脚本的文件名字,$0是启动脚本的名字。上面的语义:当运行的脚本是启动脚本时,才执行下面的代码。这样有个好处:如果脚本是被调用时使用时,可不执行这里的内容。
--------------
引子:更深的概念点 代码块/yield/模块/mixins等