最近在Codecademy上把Ruby的基础知识过了一遍,记录了一些笔记,比较零散。
0.puts print 都是将内容输出,区别是puts换行。
puts "#{var}" 双引号中用#{var}输出变量,也可以直接输出数组,hash,甚至可以调用函数
如下是注释的写法,注意=begin和=end要写在行首。
=begin
这是整段的注释
=end
#这是单行注释
注意if,while,函数,类等最后都要加end
在调用函数时可以不用加中括号(),即可以 foo(bar) ,也可以写成 foo bar
if(0) == true。ruby里唯一的两个non-true value 是 false, nil
#这样定义数组
my_arr = [1,2,3,4]
#这样定义hash
my_hash = {
"first"=>1,
"second"=>2
}
hash[undefine-key] == nil 获取hash或数组中一个没有定义的key的值,不会出错,会返回nil。
**是幂操作符。 2**3 == 8
ruby中没有自增(++)自减(--)操作符
函数定义时,可在参数前加*号代表是个数可变的参数,例 my_func(*params) params表示接受多于1个的参数
ruby中可以使用分号(;),在一行内写多条语句,比如 class MyClass; end
ruby中可以改变一个常量的值..但你会受到一个警告
整数可以使用下划线分隔开,便于阅读,比如 1_000_000 == 1000000
if/elsif 中的elsif 不能写成else if 或 elseif
1.gets.chomp 等待并得到用户的输入,gets就能得到输入内容了,用chomp能消除多余的空格、
2.函数后可以跟三种符号
! 代表破坏性的方法,相当于引用。比如 "eric".capitalize! "eric"会变成"Eric",不加!,"eric"自身不会变,只是产生一份拷贝
? 表示这个函数会返回一个布尔值
= 表示这是一个set方法
3. .. 和 ...
#两个点 .. 表示 [1, 15]; 三个点 ... 表示 [1, 15)
for num in 1..15
puts num
end
4.do...end 和 {...} 可以互相替换。比如 loop{} 或 .each do; end 等
5.Hash.new(default-value)。可以新建一个带有默认值的hash
6.组合比较符(combined comparison operator, spaceship operator) <=>
如果将要进行比较的第一个操作数等于第二个操作数,将返回0;如果大于则返回1,;小于返回-1。
7.sort函数
books = ["Charlie and the Chocolate Factory", "War and Peace", "Utopia", "A Brief History of Time", "A Wrinkle in Time"]
# To sort our books in ascending order, in-place
books.sort! { |firstBook, secondBook| firstBook <=> secondBook }
# Sort your books in descending order, in-place below
books.sort! { |firstBook, secondBook| secondBook <=> firstBook}
对传给排序方法的代码块进行排序操作必须返回1,0,或-1。如果第一个参数要排在第二个之前,那么要返回-1,反之则返回1,如果两者相等,即谁也不在谁前面,那么就返回0。
symbol适合代替字符串做hash中的key,原因:
-它们是不变的,创建过后就不会被改变;
-任意一个symbol出现之后就只有一份拷贝,所以它们节省内存
-基于以上两个原因,使用symbols代替strings做hash的key是更高效快速的
symbol和string的相互转换:
"string".to_sym或 "string".intern
:symbol.to_s
symbol不是轻量的字符串
puts "string".object_id
puts "string".object_id
puts :symbol.object_id
puts :symbol.object_id
#this output:19984220 19984020 352488 352488
自ruby1.9之后,hash有了新的语法
变化有两点,不用再用 => 符号了,冒号放到后面去了
new_hash = { one: 1, two: 2, three: 3}
symbol能当做一个函数名的引用 eg. object.respond_to? 如果一个函数接受该object当参数,就返回true
[1,2,3].respond_to?(:push)
#=> true : array.push
[1,2,3].respond_to?(:to_sym)
#=> false
疑问:symbol如何比较大小的
grades = { alice: 100, bob: 92, chris: 95, dave: 97 }
grades.select { |k,v| k > :c }
# ==> {:chris=>95, :dave=>97}
9.hash的遍历
my_hash.each {|key, value|}
my_hash.each_key {|key|}
my_hash.each_value {|value|}
判断hash中某个key是否已设置: 1. hash[key].nil? 2. hash[key] == nil
case language
when "JS"
puts "Websites!"
when "Python" then puts "Science!"
else
puts "I don't know!"
end
ruby_is_eloquent = true
ruby_is_ugly = false
puts "Ruby is eloquent!" if ruby_is_eloquent
puts "Ruby's not ugly!" unless ruby_is_ugly
#this output:
#Ruby is eloquent!
#Ruby's not ugly!
Ruby will expect an expression followed by if followed by a boolean
unless与if相反
12.条件赋值运算符 ||= 只有当一个变量是nil的时候才会被赋值成功
13.如果在函数最后没有显式的return语句,ruby的方法会默认返回最后一个表达式的值
举例说,在JavaScript中,你没有显式的说明要返回什么,那么它将返回undefined;
对Python来说,默认的返回值是None;
但是Ruby是有一些不同的,Ruby的方法将返回最后一个表达式的值。
95.upto(100)
"G".downto("A") {|letter| puts letter}
[1,2,3] << 4
#=> [1,2,3,4]
"hello" << "world"
#=> "hello world"
要注意的是,<<是改变的自身的值
字符串连接或插入,可选的方法很多
age = 26
"I am " + age.to_s + "years old"
"I am" << age.to_s << "years old"
#以上两种较复杂,not the ruby way, 应该选用如下方式
"I am #{age} years old"