Neekey

在此记录我的学习&生活.

Ruby学习笔记(一)

| Comments

ruby

今天…闲来无事,去看了一下Ruby,因为Octopress是用Ruby写的,有必要学习一下Ruby

直接到官网上去,发现Ruby非常友好,最下方有中文版本的选择,不过感觉翻译的有点蹩脚,还是直接看英文吧。首页右边有常用的几个入口,比如下载二十分钟学习ruby在浏览器里尝试Ruby(这个页面非常有爱,见下图)

ruby

很认真的花了20分钟看了二十分钟学习ruby,对Ruby算是有了一定的认识,总结一下:

Interactive Ruby

翻译成中文应该是可交互的Ruby,其实是可以让你在终端中执行ruby的程序,在Mac下直接在终端中输入irb就行了。然后尽情的尝试吧。

控制台信息输出

就是所谓的print之类的方法,在Ruby中是puts

1
2
> puts "hello world"
=> hello world

基本的简单语法

  • nil: 指的是Ruby中的空值
  • 简单的计算:
1
2
3
4
> 2+3
=> 5
> 2*3
=> 6
  • 变量赋值:Ruby中的变量不需要声明
1
2
3
> a = "hello world"
> puts a
=> hello world
  • 调用方法: 调用方法和传参的方式比较随意,下面几种都可以。如果方法不需要参数,则括号可加可不加。
1
2
3
4
> Math.sqrt(9)
=> 3
> Math.sqrt 9
=> 3
  • 字符串只能用双引号

定义方法

先看例子:

1
2
3
>def h ( name = "world" )
>puts "hello #{name}"
>end

上面的例子定义了一个叫h的方法,该方法输出hello world。用def来表示一个方法定义的开始,end来表示定义的结束。其中hello #{name}和js中的模板引擎语法类似,其中的name可以调用自己的方法,比如需要让输出首字母大写,可以修改为hello #{name.capitalize}

类的定义

先看例子:

1
2
3
4
5
6
7
8
9
10
11
class Greeter
  def initialize( name = "world" )
      @name = name
  end
  def say_hi
      puts "Hi #{@name}!"
  end
  def say_bye
      puts "Bye #{@name}!"
  end
end

类的定义由class关键字来声明,然后在end之前可以定义各种方法。上面的例子中initialize为构造函数,@name为定义的私有属性。注意到类中的方法都可以直接利用@name来访问该属性。

实例化

结合上面的代码和下面的代码,可知name无法直接访问,下面的例子由于访问name而报错:

1
2
3
4
5
> g = Greeter.new( "neekey" )
> g.say_hi()
=> Hi neekey
> g.name
NoMethodError: undefined method `name' for…

判断类实例是否具有某方法

其实class定义的类本身已经继承了很多方法,我们可以通过下面的两种方式来查看:

1
2
> Greeter.instance_methods
=> ["inspect", "taguri", "tap", "clone", "public_methods", "__send__", "taguri=", "instance_variable_defined?", "equal?", "freeze", "say_hi", "extend", "send", "methods", "hash", "dup", "object_id", "instance_variables", "eql?", "to_yaml", "say_bye", "instance_eval", "id", "singleton_methods", "taint", "frozen?", "instance_variable_get", "to_enum", "instance_of?", "display", "to_a", "h", "to_yaml_style", "type", "instance_exec", "protected_methods", "==", "===", "instance_variable_set", "enum_for", "kind_of?", "respond_to?", "to_yaml_properties", "method", "to_s", "class", "private_methods", "=~", "tainted?", "__id__", "untaint", "nil?", "is_a?"]

上面输出了类Greeter拥有的全部方法,我们也可以通过给instance_methods传递false来指定只显示自己定义的方法:

1
2
>> Greeter.instance_methods(false)
=> ["say_hi", "say_bye"]

我们可以使用respond_to?(函数名可以直接用?有木有!)来检查一个实例对象是否具有某个方法:

1
2
3
4
> g.respond_to?("name")
=> false
> g.respond_to?("say_hi")
=> true

类的动态特性

在类已经定义完成后,我们还可以继续对类进行修改:

1
2
3
class Greeter
  attr_accessor :name
end

上面代码对class进行了修改,使得name可以被访问,注意上面的代码并未覆盖原有定义,而是增加了定义。并且这些修改将马上在新的实例化对象和已经实例化的对象身上起作用。

1
2
3
4
5
> g.name
=> "neekey"
> g.name = "nic"
> g.name
=> nic"

从上面的例子来看,似乎name已经从私有变成了公共可被外部访问了(不知道ruby里面是否存在这样的术语)。但是真的是这样么?我们继续看:

1
2
3
4
> g.respond_to?("name")
=> true
> g.respond_to?("name=")
=> true

可以看到,其实通过attr_accessor的定义,不是将name变成所谓的公有属性,而是添加了该属性的gettersetter,完全可以用下面的方式来写:

1
2
3
4
> g.name()
=> nic
> g.name=("neekey")
=> neekey

另外从构造函数中的@name=name一句可以看到,Ruby的属性是可以动态添加的。

上面就是教程的大体内容。有时间继续学习~

Comments