Ruby 趣学笔记(一)

Ruby 趣学笔记(一)

本文写于 2020 年 5 月 6 日python

最近在 mac 上探索到了 homebrew 的使用方法,对 ruby 的兴趣直线上升,因此来学一学。程序员

最近几年确实你们一直在唱衰 Ruby,整个社区的生态确实也不如 python 那么庞大,可是这都不妨碍 ruby 被称做“快乐编程”。web

这几年愈来愈强调语言的性能,可是 Ruby 的做者松本行弘却认为,人才是最重要的!编程

自看到第一眼后,我就深觉得同!数组

这其实就是一个价值观的问题,人更值钱,那么就应该尽可能节省人力;机器算力更值钱,那么就应该用人力去优化程序,来节省机器的算力。ruby

可是国内的大环境你们也懂,人多爆了。数据结构

那么天然而然,从上面的结论来看,Ruby 在国内就不会流行——iphone

Ruby 做为多范式编程语言,真的很难协做;做为解释型语言,运行速度也是超级慢……编程语言

可不少人对于 Ruby 的评价仍然是:程序员的一把尖刀!函数

而且在 web 开发领域,不少大公司坚持在使用 Ruby,这足以说明 Ruby 的强大了!

函数

def sayHelo
    puts "Helo World."
end

sayHelo

就这么简单,看起来还蛮像 python 的。可是咱们继续深刻,就会发现,ruby 的语言真的使人温馨

传参的函数

def sayHello(name)
  puts "Hello, #{name}."
end

咱们还能够提供一个默认值,就像这样:

def sayHello(name = 'world')
  puts "Hello, #{name}."
end

这样,若是咱们不传入参数,那么就会自动将 world 赋给 name 变量。

class

Ruby 是一个纯 OOP 语言,那么天然开头就要讲 class 啦!

让咱们来定义一个手机类:

class Phone
  def initialize(brand = '苹果', name = '刘好', number = 15_527_782_945)
    @brand = brand
    @name = name
    @number = number
  end

  def call
    puts "#{@name}使用#{@brand}手机,拨打了#{@number}的号码。"
  end
end

iphone = Phone.new

iphone2 = Phone.new('三星', '王自如', 1123321)

你们从这里就能看到,Ruby 的语言是多么的像英语。

在这个类中咱们能够看到有个@variable,这个有什么用呢?其实就是一种变量。

  • 局部变量:局部变量是在方法中定义的变量,在方法外是不可用的,而且习惯以以小写字母或_开始(只是习惯);
  • 实例变量:实例变量能够跨任何特定的实例或对象中的方法使用,这意味着,实例变量能够从对象到对象的改变,要想定义它,须要以前放置符号@(这是语法,不是习惯!);
  • 类变量:类变量能够跨不一样的对象使用,它属于类,且是类的一个属性,要想定义它,须要在变量名以前放置符号@@
  • 全局变量:类变量不能跨类使用。若是想要有一个能够跨类使用的变量,您须要定义全局变量,它是以美圆符号$开始的。

那么如何改变实例变量呢?

使用attr_accessor: 定义可存取对象的属性。

class Game
    attr_accessor :price #, :name
    def initialize(name = "怪物猎人世界", price = 200)
        @name = name
        @price = price
    end
end

此时 price 变量就是能够改变的,name 就不能够改变。

能够利用respond_to?来判断一下(这个方法一下子会说):

mygame.respond_to?("name") # false
mygame.respond_to?("price") # true

class 下面有啥方法?

Phone.instance_methods(false)

这个方法,可让咱们知道该类下,有什么方法是咱们自定义的。

对于上面写的Phone类,输出结果就会是:

call

就这么简单。

若是中间写的是true呢,则会显示全部的方法,好比一些自带的方法。

如何判断这个方法是否存在呢?

iphone = Phone.new
iphone.respond_to?("call")

respond_to?这个方法能够判断该对象是否拥有某个方法,能够返回一个布尔值。

因此咱们一般能够这么用:iphone.respond_to?("call") && iphone.call

变量类型

什么???变量类型?

Ruby 不存在所谓的“基本类型”,好比int/float/char/...

一切皆对象的原则被严格恪守!

什么意思呢?

puts 1.to_s

to_s天生的就是 1 的方法!

对于数据类型来讲,Ruby 拥有:Number、String、Ranges、Symbols,以及 true、false 和 nil 这几个特殊值,同时还有两种重要的数据结构——Array 和 Hash。

Array

别的类型其实没太多好说的,都大同小异。

咱们从 Array 类型的方法,来体验一下 Ruby 的灵活性!

games = ['魔兽世界', '塞尔达传说', '金庸群侠传']
puts games

这个 games 的定义,若是你在 RubyMine 或者其余强大的 IDE 中编写,他就会告诉你,有更好的方式:games = %w[魔兽世界 塞尔达传说 金庸群侠传]

这就是为何 Ruby 不易协做,一千个程序员有一千种写法与实现方法!

数组的遍历

这是永远的重点,正常编程中最为经常使用的方法。

Ruby 能够经过each来遍历数组,具体语法以下:

games.each do |game|
  puts "我喜欢#{game}"
end

这个地方稍微提一句,我曾在某个地方看到过,写单引号的程序最后会比写双引号的小(文件大小)。

可是这里这种模板字符串的写法,必需要双引号。

带上数组下标的遍历

games.each_with_index do |game, i|
  puts "第#{i}个游戏是#{game}"
end

数组的链接

games.join(','),这个方法其实不少语言都有,能够返回一个由逗号链接的、由数组每一个元素顺序组成的字符串。

怎么判断该变量是不是数组

这个怎么判断呢???

很简单,仍是运用respond_to?

怎么用?

刚刚的each方法就能够!

games.respond_to?('each') && puts '这是一个数组!'

字符串操做

刚刚的一些示例代码,应该能够看出来一些套路。

接下来总结一下:

  • +:字符链接
  • <<:字符带入
  • *:字符循环
a = "helo";
b = "world";
puts a + " " + b;

# <<:字符带入
a << b
puts a
puts b

# 这个其实至关于 a = a + b

# *:字符循环
a="A"
puts a*4
相关文章
相关标签/搜索