Day3 读书笔记&心得体会

2017-06-01  本文已影响23人  柳辉

一、读书笔记
2.6 Block和迭代器

{ puts "Hello" }
do
    club.enroll(person)
    person.socialize
end

为什么有两种分解符呢?部分是有人觉得有时候用一种分解符比另外一种感觉更自然。另外一部分原因是它们有不同的优先级:花括号比do/end绑定的更紧密些,在本书中,我们尝试遵循正在成为Ruby标准的一个约定俗成,单行block用花括号,多行block用do/end。

verbose_greet("Dave", "loyal customer")  { puts "Hi" }

然后使用Ruby的yield语句,方法可以一次或多次地调用(invoke)相关联的block。可以把yield想象成比如方法调用,它调用含有yield语句的方法所关联的block。

def call_block
    puts "Start of method"
    yield
    yield
    puts "End of method"
end

输出结果:

Start of method
In the block
In the block
End of method

看看(puts "In the block")block中的代码块如何被执行两次,每次调用yield时,代码都会被执行。

def call_block
    yield("hello", 99)
end
call_block { |str,  num| ... }

在Ruby库中大量使用了block来实现迭代器:迭代器是从某种收集(collection)如数组中连续返回元素的方法。

animals = %w( ant bee cat dog elk )  # 创建一个数组
animals.each { |animal| puts animal }  # 迭代它的内容
输出结果:
ant
bee
cat
dog
elk
def each
    for each element  # 无效的Ruby语句 
      yield(element)  
    end
end
['cat', 'dog', 'horse'].each { |name| print name, " " }
5.times { print "*" }
3.upto(6) { |i| print i }
('a'..'e').each { |char| print char }

输出结果:

cat dog horse *****3456abcde

上面的代码要求对象5 五次调用block;然后要求对象3 调用一个block,并传入一个连续的值,直到这个值到达6为止。最后对a到e的字符区间(range),使用each方法调用block。

2.7 读/写文件

printf("Number: %5.2f, \nString: %s\n", 1.23, "hello")

输出结果:
Number:1.23,
String:"hello"
在这个例子中,"Number: %5.2f, \nString: %\n"格式化字符串,告诉printf替换一个浮点数(最多允许5个字符串, 并且2个在小数点后面)和一个字符串。注意到回车换行符(\n)嵌入到格式化中:回车换行符把输出移动到下一行。

line = gets
print line

二、心得体会
今天完成了什么?
1.听剑爸讲解app.rb
2.读了《Programming Ruby》的第2.6-8节
3.试着解释app.rb昨天剩余的部分
4.跟小白探讨网站的模型、视图等等之间的关系

今天学到了什么?

ap Group::Post
ruby:
  fields = {
    name: { edit: true },
    parent_id: { edit: -> (f) { f.grouped_collection_select :parent_id, [ [ '一级', [ model.root ] ],...class: 'width-100 Chosen' } },
    children: {},
    orders: {},
    words: {},
  }
= render 'admin/.../form', fields: fields

代码理解:

  def ix
    @records = (@records || model)
      .ransack(params[:q]).result(distinct: true) # 搜索那些不重复的记录
      .order([ params[:order].to_s.match(/\A(\w+)\s(asc|desc)\Z/).try(:[], 1..2) || %w[ id desc ] ].to_h) # 排序
      .page(params[:page]).per(params[:per]) #分页

    respond_to do |format| #导出格式
      format.html
     ...
    end
  end

  def rt
    return redirect_to @url if @url = current_user.admin_operator.try(:url).presence #判断是否有登录和操作权限
    render html: '', layout: true
  end

  private

  def rd_with_record
    respond_to do |format|
      format.html do
       ....
      end
      format.json { render json: @record.as_json(model.admin_json_options || model.json_options || { only: %i[ id ] }), status: request.get? ? :ok : !@saved ? :unprocessable_entity : params[:action] == 'create' ? :created : :accepted }
    end
  end

  def ce_log
    return if request.get? && !(params[:controller] == 'admin/bag/orders' && params[:action].starts_with?('stats_'))
    Admin::Log.create({
      operator: current_user.admin_operator, # 操作权限
      resource: params[:controller].remove(/^admin\//).singularize, # 资源
      action: params[:action], # 动作
      paramid: params[:id], # id
    })
  end

  def rs_data # 导出数据
    fields = [ :id ] + (model.export_fields || []) + [ :created_at, :updated_at ].find_all { |field| model.column_for_attribute(field) } # 选择要导出的栏位
    header = fields.map { |field| model.human_attribute_name(model.reflections[field.to_s].try(:foreign_key) || field) } # 导出的栏位标题
    body = @records.map do |record| # 主要内容
      fields.map do |field|
        next I18n.t("activerecord.enums.#{model.name.underscore}.#{field}").with_indifferent_access[record.send(field)] if model.defined_enums.with_indifferent_access[field]
        case value = field.to_s.split('.').inject(record) { |object, method| object.try(method) }
        when true
          '✔'
        when false
          '✘'
       ....
        else
          value
        end
      end
    end
    [ header ] + body
  end

end

上一篇下一篇

猜你喜欢

热点阅读