20分钟体验Ruby

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

 

你可能感兴趣的:(Ruby)