• 看来是我对闭包理解错误。 python3、javascript 都是在执行时才检查闭包内变量,而 ruby、php5、golang、c# 都是在定义时已检查闭包内容的。

  • 有点疑问。比较 ruby 和 python3 的闭包:

    x = 1
    pr = Proc.new do
       (x+y)
    end
    y = 2
    puts 'proc定义完毕'
    puts pr.call
    
    x = 1
    lam = lambda { return (x+y) }
    y = 2
    puts lam.call
    
    # python3 闭包1
    
    x = 1
    def f():
      def g():
        return (x+y)
      return g()
    
    y = 2
    print(f())
    
    # python3 闭包2
    
    x = 1
    lam = lambda : (x+y)
    y = 2
    print(lam())
    

    可见 python3 的闭包内的变量是在闭包块在执行时才查找变量继承关系的;而 ruby 是在闭包被定义的时候就查找变量继承关系的。

    请问 ruby 这样做是考虑到什么了吗?因为我写代码的时候习惯先写定处理逻辑,再设定变量值,这样在 ruby 里写闭包,就可能不小心踩到坑了。

  • x = 1
    pr = Proc.new do
      begin
        x
      rescue NameError
       puts '未定义x'
      end
      begin
        y
      rescue NameError
       puts '未定义y'
      end
    end
    y = 2
    puts 'proc定义完毕'
    pr.call
    
    # 结果是: 未定义y
    

    好像是这样,感觉这样有点奇怪啊,哪位可以解释一下定义 Proc 的时候都做了些什么?

  • 最近挂过的 redis.io 好像是 ruby 的 cuba web 框架搭的,报错的时候打印了详细信息

  • Ruby 抓疫情数据 at 2020年03月15日

    执行方式: ruby tiny_server.rb 每次访问 localhost:94/whfy 时从腾讯新闻下载数据

    之前玩着搞的,不更新

    require 'json'
    require 'open-uri'
    require 'erb'
    
    QQXW_INFO_PATH = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    
    #'http://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_area_counts' # <- 这个和网页上显示的数据不相同
    
    HEADER = {
      'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'
    
    }
    
    def update_json_data
      puts '正在下载数据'
      qqxw_infos_handler = open(QQXW_INFO_PATH, HEADER)
      qqxw_infos_content = qqxw_infos_handler.read
      puts '下载数据完成, 正在解析..'
      domestic_datas = JSON.parse(JSON.parse(qqxw_infos_content)['data'])['areaTree'][0]['children']
    
      # 读取erb模板
      if !File.exist?('./page.erb')
        raise "找不到erb模板"
      end
    
      fio = File.open('./page.erb')
      fc = fio.read
      fio.close
    
      html_content = ERB.new(fc).result(binding)
    
      # 调试模块
      # require 'irb'
      # binding.irb
    
      # exit
      domestic_datas = nil # 释放内存
      fc = nil
      return html_content
    end
    
    # 加载sinatra
    puts '加载sinatra'
    require 'sinatra'
    
    
    # 配置sinatra
    configure do
      set :server, 'webrick'
      set :bind, '0.0.0.0'
      set :port, 94
    
    end
    # 设置跳转
    get '/whfy' do
      return update_json_data()
    end
    
    
    <html>
    <head><meta charset="utf-8"><title>武汉肺炎_腾讯新闻实时数据</title>
    </head>
    <body>
    <!-- 记录中国省份总计 -->
    <h2>省份汇总</h2>
    <table border="1"><thead>
    <tr>
    <th>省份</th>
    <th>共计确诊人数</th><th>共计疑似人数</th><th>共计死亡人数</th><th>共计治愈人数</th>
    <th>本日新增确诊人数</th><th>本日新增疑似人数</th><th>本日新增死亡人数</th><th>本日新增治愈人数</th>
    </tr>
    </thead><tbody>
    <!-- 腾讯新闻返回的省份数据已经按确诊人数排序好了的 -->
    <% domestic_datas.each do |_current_area_info| %>
    
    <%   total_count_confirm = _current_area_info['total']['confirm'] %>
    <%   total_count_suspect = _current_area_info['total']['suspect'] %>
    <%   total_count_dead = _current_area_info['total']['dead'] %>
    <%   total_count_heal = _current_area_info['total']['heal'] %>
    <%   today_count_confirm = _current_area_info['today']['confirm'] %>
    <%   today_count_suspect = _current_area_info['today']['suspect'] %>
    <%   today_count_dead = _current_area_info['today']['dead'] %>
    <%   today_count_heal = _current_area_info['today']['heal'] %>
    
    <tr>
    <th><%= _current_area_info['name'] %></th>
    <th><%= total_count_confirm  %></th>
    <th><%= total_count_suspect  %></th>
    <th><%= total_count_dead   %></th>
    <th><%= total_count_heal  %></th>
    <th><%= today_count_confirm  %></th>
    <th><%= today_count_suspect  %></th>
    <th><%= today_count_dead   %></th>
    <th><%= today_count_heal  %></th>
    </tr>
    <% end %>
    
    </tbody></table>
    
    <br><br><br>
    <!-- 记录中国各地区的详细信息 -->
    <h2>中国地区详细信息</h2>
    <table border="1"><thead>
    <tr>
    <th>大区名</th><th>地区名</th>
    <th>共计确诊人数</th><th>共计疑似人数</th><th>共计死亡人数</th><th>共计治愈人数</th>
    <th>本日新增确诊人数</th><th>本日新增疑似人数</th><th>本日新增死亡人数</th><th>本日新增治愈人数</th>
    </tr>
    </thead><tbody>
    <% domestic_datas.each do |_current_area_info| %>
    <%   current_cities_infos = _current_area_info['children'] %> 
    
    <%   current_cities_infos.each do |_x| %>
    
        <tr>
        <th><%= _current_area_info['name'] %></th>
        <th><%= _x['name'] %></th>
        <th><%= _x['total']['confirm'] %></th>
        <th><%= _x['total']['suspect'] %></th>
        <th><%= _x['total']['dead'] %></th>
        <th><%= _x['total']['heal'] %></th>
        <th><%= _x['today']['confirm'] %></th>
        <th><%= _x['today']['suspect'] %></th>
        <th><%= _x['today']['dead'] %></th>
        <th><%= _x['today']['heal'] %></th>
        </tr>
    
    <% end %>
    <% end %>
    
    </tbody></table>
    
    
    </body>
    </html>
    
  • *经问题,选什么 ide at 2020年01月04日

    netbeans 6 里面把被输入法占用的 Ctrl+Space 换成其他快捷键,然后按这组快捷键就能弹出代码完成菜单了。羞愧

  • 求内存盘访问文件的扩展 at 2020年01月01日

    在数据库连接里面 select * ,会把所有数据库的数据读入 ruby,其中每个数据都是单独存放的。

    如果只是读入 sqlite3 的二进制数据库文件,则这个 “文件” 是连续的。

    反正我觉得 ruby 还是挺占内存的……

  • 求内存盘访问文件的扩展 at 2019年12月29日

    哦哦,其实稍微学了学 pgsql,要换过去也不是问题,纯个人单机的数据。那我就换 pg 了。

  • 现在有点明白了, map 抛出的 Enumerator 也只是对元素的引用,所以在 map 里面修改 Enumerator 的每个元素会影响到 map 以外对应的实际的元素。

  • Ruby 2.7.0 Released at 2019年12月26日

    作为一个业余学写脚本的学生,一开始因为 ruby 的.each 遍历和 do...end 的奇怪的语法而排斥它。后来在 c 语言、java 和 perl5 里面踩了一些坑,决定试试 ruby,从此少了一些整体上的烦恼。虽然我自己写的脚本性能不一定能优化得好,但是修改起来还是容易多了。

    现在一般是循规蹈矩地写命令(按 c# 的编程习惯),实在不得已要用一些灵活的动态方法时,都在 irb 里面测试完再用。