啥?你没学过 ruby?
嗯哼,其实我也没学过,今天看了这篇,尽管你还是不了解它,但是挡不住你会爱上它的冲动
首先让我们先来完成一个简单的小题目:
那么在我在完全没有学习这门语言,直接入手写东西,我是这么做的:
- 分析这个题目大致需要用到如下的知识点
- 定义变量 : 数值类型,引用类型(数组)
- 变量的操作:数组追加值的方法
- 定义函数
- 使用循环
大致有了这些知识点就足够完成这道题目,同时也就掌握了ruby
的这些语法的书写方法.
然后就足一的去网上找ruby
语言的这些语法的使用方法.
那么除了怎么写,我们应该还需要关注一个问题,怎么运行?
根据我们经验,我们知道js语言的执行方法是:$ node 文件名
那么现在是另一种语言,该怎么执行它呢,我们不防先假设一下,那它是不是用$ ruby 文件名
也可以呢,那我们来试一试:
在网上看到这样一个hello world
例子,发现ruby
的代码可以不放在函数里面也可以直接执行,那我把它写在一个ruby文件中,文件名为:FizzBuzz.rb
测试,内容如下:
puts("hello world")
执行这个文件
,$ ruby FizzBuzz.rb
(注意这里必须是完整的文件名,以及文件的扩展名)
输出结果为:
ok,那么我的猜想是对的,我们可以类比
js
文件的执行方法,来知道ruby文件的执行方法。
注意:
经过测试发现,这里执行
ruby
文件的时候,必须使用完整的文件名,不像js
, 可以不需要写文件名后面的扩展名,比如一个js
文件hello.js
只需要执行:$ node hello
就可以啦,但是ruby
的话,不加文件名的扩展名会出错:
思考的姿势
那么,这里我要安利一下,不管我们遇到什么问题,我们都不应该立马去查一下解决办法是什么,我们应该先自己先猜想一下它的原因和解决办法,然后再去找答案,这样可能对自己的思考能力有很大的提升和帮助.
所以这个题目,我的第一版代码就写成这样:
版本1.1(以下代码都是放在FizzBuzz.rb
文件中)
# 如果输入的数字是 6
i = 0 #这里是ruby定义一个简单变量的方法,发现它不需要像其他语言一样需要规定它的类型,而是直接给变量赋值就可以了
numArr = Array.new #这就是ruby定义一个数组的方法,也可以定义数组的长度为20,如:Array.new(20)
for i in (1..6) #ruby使用for循环,其中..表示一个范围,这里表示1~6 的数字,包括1和6
if i%3 ==0 && i%5 ==0 #这里的条件一定要放在最前面,如果放在后面会因为前面条件先满足而劫持
numArr<<"FizzBuzz" # ruby中向数组中追加一个元素的方法<<, 也可以使用push方法
elsif i %3 == 0
numArr<< "Fizz"
elsif i%5 ==0
numArr<<"Buzz"
else
numArr<
执行:$ ruby FizzBuzz.rb
输出结果如下:
我学会函数的使用后代码写成这样:
# 如果输入的数字是 6
def get_StrNum #这就是定义一个函数的方法,def 类似于js中的function,get_StrNum就是方法名字
i = 0 #这里是ruby定义一个简单变量的方法,发现它不需要像其他语言一样需要规定它的类型,而是直接给变量赋值就可以了
numArr = Array.new #这就是ruby定义一个数组的方法,也可以定义数组的长度为20,如:Array.new(20)
for i in (1..6) #ruby使用for循环,其中..表示一个范围,这里表示1~6 的数字,包括1和6
if i%3 ==0 && i%5 ==0 #这里的条件一定要放在最前面,如果放在后面会因为前面条件先满足而劫持
numArr<<"FizzBuzz" # ruby中向数组中追加一个元素的方法<<, 也可以使用push方法
elsif i %3 == 0
numArr<< "Fizz"
elsif i%5 ==0
numArr<<"Buzz"
else
numArr<
然后执行:$ ruby FizzBuzz.rb
咦,咋没有输出呢,检查一下,没有错啊,真的没有错啊
再来好好思考一下,真的没有问题吗
为什么它没有输出,在这个函数的开头放一个输出puts("hello")
, 重新执行后,发现依然没有输出。 那就说明,这个函数根本就没有执行啊,为什么没有执行呢?想想我们写 js
的时候,如果写一个函数,想让它执行,怎么办呢,调用它啊~! 所以类比到这里,也是一样的啊,想让一个函数执行,也必须要有人调用它啊!
编程语言思想----移花接木
ok,是不是有学到一点就是类比,其实编程语言都是相通的,故思想也都是可以类比的所以在 已经掌握一两门编程语言之后,再学习其它语言就不会那么吃力了!这是一个真理,如果你已经掌握编程语言的思想精髓的话,而不是仅仅会使用,移花接木就不会了,那是不行的!
所以在上面的代码后main加上一个调用那个函数的代码get_StrNum
.
然后再执行ruby FizzBuzz.rb
输出结果为:
在我学会ruby
的类的写法之后
给我的实现代码在加上单元测试:
我使用的ruby
的测试框架为unit test
:
# 如果输入的数字是 变量n
class FizzBuzz
def get_StrNum(n) #这就是定义一个函数的方法,def 类似于js中的function,get_StrNum就是方法名字
i = 0 #这里是ruby定义一个简单变量的方法,发现它不需要像其他语言一样需要规定它的类型,而是直接给变量赋值就可以了
numArr = Array.new #这就是ruby定义一个数组的方法,也可以定义数组的长度为20,如:Array.new(20)
for i in (1..n) #ruby使用for循环,其中..表示一个范围,这里表示1~n 的数字,包括1和6
if i%3 ==0 && i%5 ==0 #这里的条件一定要放在最前面,如果放在后面会因为前面条件先满足而劫持
numArr<<"FizzBuzz" # ruby中向数组中追加一个元素的方法<<, 也可以使用push方法
elsif i %3 == 0
numArr<< "Fizz"
elsif i%5 ==0
numArr<<"Buzz"
else
numArr<
我的测试:
require 'test/unit' # 引入ruby的测试框架,这个在安装ruby的时候,就已经安装了,世界引入即可
require_relative "FizzBuzz.rb" # 引入要测试文件名
class TestFizzBuzz < Test::Unit::TestCase # 这个测试类,<表示继承,::是一个命名空间,表示要继承Test下面的Unit 下面的TestCase
strNum = FizzBuzz.new # FizzBuzz是实现代码中的一个类名,这里表示创建实现类FizzBuzzz的一个实例
def test_fizz_buzz #这里是一个测试函数
assert_equal [1], strNum.get_StrNum(1) #这是一个测试的断言 ,左边是期望值expected,右边的实际值
assert_equal [1,2],strNum.get_StrNum(2)
assert_equal [1,2,"Fizz"],strNum.get_StrNum(3)
assert_equal [1,2,"Fizz",4,"Buzz"],strNum.get_StrNum(5)
assert_equal [1,2,"Fizz",4,"Buzz","Fizz",7,8,"Fizz","Buzz",11,"Fizz",13,14,"FizzBuzz"],strNum.get_StrNum(15)
end
end
ok,现在跑一下测试文件,执行:$ ruby TestFizzBuzz.rb
一个测试,5个断言,0个失败,表示测试全部通过!
这个过程,短短的时间,简单的练习,关于 ruby
学到什么东西了呢
总结
-
技术知识
- 定义一个变量:
变量名 = 赋值
- 定义一个数组:
arr = Array.new
或 规定它的长度arr = Array.new(10)
数组追加内容:arr << 5
- 输出变量的方法:
puts( 内容)
- 定义一个函数:
def 函数名
.....
end
- 定义一个类:
class 类名
....
end
for循环:
for i in 1..n
或者for i in (1..n)
引入文件的方法:
require_relative "FizzBuzz.rb"
require 'test/unit'
-
实例化一个对象:
实例名 = 类名.new
9.执行
ruby
代码的方法:$ ruby 文件名
注意: 这里必须为完成的文件名,包括扩展名,区别于js
-
软技能
- 遇到什么问题,我们都不应该立马去查一下解决办法是什么,我们应该先自己先猜想一下它的原因和解决办法,然后再去找答案,这样可能对自己的思考能力有很大的提升和帮助.提高学习能力
- 编程语言思想----移花接木
学会类比,模仿,提高学习效率