Ruby的一些理解
定义函数:使用 def 关键字即可随时定义,不需要在类里面
代码块:类似于 block,闭包
Mixin:混入,可以将属性、方法等封装为模块,在别的类里调用。可实现多继承。
开放类:可以拓展、重写已有类的方法,类似于继承
元编程:可以自己定义语言,编写能写程序的程序。
Ruby 编程练习
ruby最大的优势就是语法糖丰富、开发效率高,但与之相对应的,丰富的api就意味着需要更多地去记忆。
1、基本语法练习:猜数字游戏
puts "欢迎来玩最好玩的猜数字游戏!你叫什么?"
$name = STDIN.gets
puts "Hi "+$name+"Here we go!"
$range = 0
reset = true
$play = 1
puts "请输入猜测数字的范围:"
while $range.to_i == 0
$range = STDIN.gets
puts '数字不合法!' if $range.to_i == 0
end
while $play.to_i == 1
if reset
myNum = rand($range.to_i)
reset = false
end
puts "请输入一个#{$range}以内的数字:"
$userNum = STDIN.gets
if $userNum.to_i > myNum
puts '+++++ 猜大了'
elsif $userNum.to_i == myNum
puts '!!!!!猜对了~!!'
reset = true
puts '开始新的一局?' + '继续,则输入1,结束,则点击任意键'
$play = STDIN.gets
else
puts '-----猜小了'
end
end
puts '谢谢玩耍~'
2、数组操作练习:遍历数组
# 有一个数组,包含16个数字。仅用 each 方法打印数组中的内容,一次打印 4 个数字。然后,用可枚举模块的 each_slice 方法重做一遍。
# 仅用 each:
puts "方案一:"
a = (1..16).to_a
a.each do |i|
index = a.index(i)
if index % 4 == 0
puts "#{a[index]}, #{a[index + 1]}, #{a[index + 2]}, #{a[index + 3]}"
end
end
# 仅用 each:
puts "方案二:"
i = 0
(1..16).to_a.each do |n|
i += 1
print i % 4 == 0 ? "#{n}\n" : "#{n},"
end
# 可枚举模块each_slice:数组里已包含该模块
puts "方案三:"
(1..16).to_a.each_slice(4) {|i| p i}
3、树、类定义、散列表练习:支持散列表构建的数
# 构造一棵树,使其接收散列表和数组嵌套的结构,并能把节点打印出来
class Tree
attr_accessor :children, :name
def initialize(treeSet)
@children = []
@name = treeSet.keys
treeSet.each_value do |childrenSet|
unless childrenSet.empty?
@children.push(Tree.new(childrenSet))
end
end
end
def visit_all(&block)
visit &block
children.each {|c| c.visit_all &block}
end
def visit(&block)
block.call self
end
end
set = {'grandpa' => { 'dad' => {'child 1' => {}, 'child 2' => {} }, 'uncle' => {'child 3' => {}, 'child 4' => {} } } }
family = Tree.new(set)
puts "visit a node"
family.visit {|person| puts person.name}
puts "visit entire tree"
family.visit_all {|person| puts person.name}
4、文件读取、文本关键字搜索:
# 读取文本文档,搜索出现了指定关键字的文本行,将行号及行内容打印出来
def my_grep
puts "输入想搜索的关键字:"
# gets方法,会取输入缓存区所有字符,包含换行符,需去除
$keyword = STDIN.gets.strip
index = 0;
File.foreach("data") do |line|
index = index + 1
if line.include? $keyword
puts "#{index}: #{line}"
end
end
end
my_grep