Day3 读书笔记&心得体会

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

  • 本节简单描述Ruby的一个独特特性,Block,一种可以和方法调用相关联的代码块,几乎和参数一样,这是一个不可思议的强大的特性。一位评论家说:这个特性是相当有趣和重要,如果以前没有注意到,从现在开始你应该注意了。

  • 可以用Block实现回调(但它比Java的匿名内部(anonymous inner)类更简单),传递一组代码(但它远比C的函数指针更灵活),以及实现迭代器。

  • Block 只是花括号或者do...end之间的一组代码

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

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

  • 一旦创建了block,就可以与方法的调用相关联。把block的开始放在含有方法调用的源码行的结尾处,就可以实现关联。比如,在下面的代码中,含有puts "Hi"的block与greet方法的调用相关联。

  • greet { puts "Hi" }
    如果方法有参数,它们出现在block之前。

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

然后使用Ruby的yield语句,方法可以一次或多次地调用(invoke)相关联的block。可以把yield想象成比如方法调用,它调用含有yield语句的方法所关联的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时,代码都会被执行。

  • 可以提供参数给对yield的调用:参数会传递到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
  • 让我们看一下如何实现应用在前面例子中的Array类中的each迭代器。each迭代器循环处理数组中的元素,对每个元素调用yield。在伪码中,它可能写成:
    在Array类中... ...
def each
    for each element  # 无效的Ruby语句 
      yield(element)  
    end
end
  • 许多内建于C和Java等语言的循环结构在Ruby中只是方法调用,这些方法会零次或多次调用相关联的block。
['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 读/写文件

  • Ruby有一个完备的I/O库,但是本书的大多数例子只使用其中一些简单的方法,已经碰到了两个用来输出的方法。puts输出参数,并在每个参数后面添加回车换行符。print也输出它的参数,但没有添加换行符。它们都可以用来向任何I/O对象进行输出,但在默认情况下,它们输出到标准输出。

  • 另一个常用的输出方法是printf,它在一个格式化字符串的控制下打印出它的参数(就像C或Perl中的prinf)。

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

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

  • 有许多方式可以把输入读到程序中:回车换行符把输出移动到下一行。
  • 有许多方式可以把输入读到程序中,最传统的方式是使用gets函数,它从程序的标准输入流中读取下一行。
line = gets
print line

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

今天学到了什么?

  • try 如果接收对象是零对象或NilClass,则NoMethodError异常将不会被引发,否则将返回nil。
  • distinct: true
  • to_s 用于将对象显示为字符串,通常是使用put的结果;注意,甚至可以通过覆盖检查,来覆盖显示对象的内容。
  • to_h 返回此参数的安全哈希表示,并删除所有未提交的键。
  • awesome_print 可以全面打印Ruby对象,举个例子:
ap Group::Post
  • slim模板 致力于减少视图语法代码,方便、快捷
    举个例子:
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 一、读书笔记3.4 剩余部分当对象需要访问同类的其他对象的内部状态时,使用保护访问(protected acces...
    柳辉阅读 361评论 0 0
  • 一、心得体会1、今天完成了什么? 20页镐头书 10个controller 回顾以前什么是block?为什么要有b...
    柳辉阅读 454评论 0 0
  • 一、读书笔记回顾昨天的收获:什么是block、proc? block和proc是两种不同的东西, block有形无...
    柳辉阅读 370评论 0 0
  • 一、心得体会1、今天完成了什么? 今天看了20页的镐头书(139-160) 看了10个controller 2、今...
    柳辉阅读 317评论 0 0
  • 一、心得体会1、完成了什么? 看了20页镐头书 看了10个controller 2、收获了什么? sub与gsub...
    柳辉阅读 217评论 0 0