2月9日 Time and Date(Ruby基础) \n 2月10日 ,使用Proc,block对象化。

20.1Time类 ,Data类

 Time.now或者Time.new:获取当前时间。

 

 相关Method: 

 year, month, hour, min ,sec,

 wday: 一周中的第几天,返回整数。(0表示星期天)

 mday: the day in a month

 yday: the day in one year

zone: 时区time zone  , => "CST"

 

Time.mktime(参数)

> t = Time.mktime(2018,02,11,9,37)     #=> 2018-02-11 09:37:00 +0800

 

sleep(10)  #等待多少秒

 

20.3 Time对象可以互相比较和运算。 

 > t = Time.now          #=> 2018-02-11 09:39:39 +0800

> t1 = t + 60*60*24   # => 2018-02-12 09:39:39 +0800

 

t.to_s  #转换为字符串

t.strftime() #客制化某种格式的字符串

 

20.5 本地时间

t.utc   #得到一个新对象,获取国际协调时间UTC

t.localtime   #得到一个新对象, 本地时间 

 

20.6 从字符串获取时间。 

获得字符串:如

 

"2010年12月23日下午8点17分50秒"

 解析成Time对象:

Time.prase(str),但中文的无法解析,特殊格式的也无法解析。 需要自定义Method。

 

例子:把中文时间,转换为Time对象?

def cparsedate(str)
now = Time.now
year = now.year
month = now.month
day = now.day
hour = now.hour
min = now.min
sec = now.sec
str.scan(/(上午|下午)?(\d+)(年|月|日|点|分|秒|时)/) do
case $3
when "年"
year = $2.to_i
when "月"
month = $2.to_i
when "日"
day = $2.to_i
when "点"
hour = $2.to_i
hour += 12 if $1 == "下午"
when "时"

hour = $2.to_i

when "分" min = $2.to_i when "秒" sec = $2.to_i end end return Time.mktime(year, month, day, hour, min, sec) end p cparsedate("2010年12月23日下午8点17分50秒") p cparsedate("12月23日下午8点17分50秒") p cparsedate("上午8时17分50秒") p cparsedate("8点17分50秒")

 

 20.7 获取日期

require "date" 获取Date类需要引用date库 

 Date.today

 相关method和Time一样。

指定生成日期使用:Date.new(2018, 1, 31) ⚠️  :和Time.mktime()区分

 

20.8计算日期

Date对象减法,返回天数。对象是Rational对象 

> d1 = Date.new(2018,1,1)
 => #<Date: 2018-01-01 ((2458120j,0s,0n),+0s,2299161j)>
> d2 = Date.new(2018,1,4)
 => #<Date: 2018-01-04 ((2458123j,0s,0n),+0s,2299161j)>
> d2 - d1  #=> (3/1)

 

<<,>>返回前/后一个月相同的日期

 

> d = Date.today

=> #<Date: 2018-02-11 ((2458161j,0s,0n),+0s,2299161j)>

> d + 1
 => #<Date: 2018-02-12 ((2458162j,0s,0n),+0s,2299161j)>
> d >> 1
 => #<Date: 2018-03-11 ((2458189j,0s,0n),+0s,2299161j)>

 

20.11 

to_time 和 to_date互相转换Time对象和Date对象。

 

GC:Garbage Collection ,ruby自动支持。 

 

 

 

根据生日计算年龄。

定义一个Person类,内含初始化method,  age method. 

require "date"
class Person
attr_reader :birth_date
# 通过 Person.new 获取关键参数生年月日
def initialize(birth_date)
@birth_date = birth_date
end
# 返回某个日期的年龄。没有指定日期则返回今天的年龄。
def age(date=Date.today)
# 如果是出生前则返回 -1 (错误)
return -1 if date < birth_date
years = date.year - birth_date.year

if date.month < birth_date.month
# #没满一年,所以减一年
years -= 1
elsif date.month == birth_date.month && date.day < birth_date.day
# 还差不到一个月生日,所以减一年
years -= 1
end
return years
end
end
ruby = Person.new(Date.new(1993, 2, 24))
p ruby.birth_date # 生年月日
p ruby.age # 今天
p ruby.age(Date.new(2013, 2, 23)) # 20岁的前一天 19
p ruby.age(Date.new(2013, 2, 24)) # 20岁的生日 20
p ruby.age(Date.new(1988, 2, 24)) # 出生之前 -1

 上午的练习,设计其他的知识点,没仔细学。

 


 

 第21章,Proc 对象。

(已完成练习。) 

 21.1Proc类是什么?使块对象化的类。

 

创建和执行Proc对象: 

Proc.new():典型方法

proc{...}  :对proc方法指定block

Proc#call 执行block. 参数是块变量,块中最后的表达式的值返回,            call(params,...) → obj

例子: 

a_proc = Proc.new {|scalar, *values| values.map {|value| value*scalar } }

答案:

a_proc.call(9, 1, 2, 3)  #=> [9, 18, 27]
a_proc[9, 1, 2, 3]  #=> [9, 18, 27]
a_proc.(9, 1, 2, 3) # 仅仅隐藏了call
a_proc.yield(9, 1, 2, 3) #=> [9, 18, 27]
*values:代表传入的参数转化为数组。

 

21.11  lambda 表达式 ,简写:->(块变量){处理}

和Proc.new, proc一样,但有区别,lambda创建的Proc对象的行为更接近method

区别:

第一,参数检查严格。 

a_proc = proc {|a,b| [a,b] }
a_proc.call(1) #=> [1, nil]
a_proc = lambda {|a,b| [a,b] }
a_proc.call(1) # ArgumentError: wrong number of arguments

第二,lambda可以使用return将值从block返回。 

#计算立方cube
def power_of(n)
  lambda do |x|
    return x**n
  end

# 或者简写 :   ->(x){return x**n} 

end
cube = power_of(3)
p cube.call(5)  #=> 125

 

21.12 通过Proc参数接收块

&block 

def total2(from, to, &block)
  result = 0
  from.upto(to) do |num|
    if block
      result += block.call(num)
    else
      result += num
    end
  end
  return result
end
p total2(1, 2)
p total2(1, 10){|num| num ** 2}    #=>385

 

21.2 Proc特征

 

Proc对象可以作为无名函数(lambda)或方法使用,但不是单纯的将“处理”对象化,

还可以将处理的内容,本地变量的作用域等定义block时的状态一起保存下来。

闭包closure:将处理内容,变量等环境同时保存的对象。 (保存数据)

 

def counter
  c = 0          # 初始化计数器
  Proc.new do    # 每调用1次call方法,计数器加1
    c += 1       # 返回加1后的Proc对象
  end
end

# 创建计数器c1并计数
c1 = counter
p c1.call      #=> 1
p c1.call      #=> 2
p c1.call      #=> 3

# 创建计数器c2并计数
c2 = counter   # 创建计数器c2
p c2.call      #=> 1
p c2.call      #=> 2

# 再次用c1计数
p c1.call      #=> 4

 

21.3 Proc类的 instance method

 

prc === arg 

在Proc对象作为case语句的条件时使用,通过===指定的参数只能是1个,这是语法的🚫。

 

prc.parameters ->[种类,参数名]

prc,lambda? 

 

posted @ 2018-02-09 15:56  Mr-chen  阅读(254)  评论(0编辑  收藏  举报