• 容错和速错 at 2015年01月26日

    如果 hash 在函数的参数中,那么除了 Hash#fetch 还有个好办法:

    def foo opts
      bar = opts.fetch :bar
    end
    

    可以这么写 (Ruby 2.2)

    def foo bar: bar
      bar
    end
    
    foo({}) # bar 未给定
    foo baz: 3 # keyword baz 未定义
    foo bar: 3 # :)
    
  • #3 楼 @hw676018683 这样写不就行了么?

    def xx foo=foo()
    end
    

    <2.2 中才是错的:

    def foo
       "abc"
    end
    def xx( foo = foo )
       p foo
    end
    
    foo = foo
    p foo # nil
    xx # "abc" ? WTF?
    

    再者把参数名和值写成一样的代码本身就挺有问题,参数中写 foo = foo 应该直接报语法错误才对...

  • 明明是旧东西的问题... 换到一般代码中想:

    def foo
      "abc"
    end
    foo = foo # 这明显应该是 nil 啊
    
  • #1 楼 @blacktulip 我也是,经常止步于 hello world...

    #2 楼 @hisea 从 hygienic macro 翻译来的,hygien 就是卫生,很多写 lisp 的书都这么讲...

  • 正负抵消的删除 at 2015年01月23日

    #13 楼 @blacktulip 配合"伸手"的主题...

  • 正负抵消的删除 at 2015年01月23日

    嗟,来食!

    result = []
    arr.each{|e|
      if i = result.index([e[0], -e[1]])
        result.delete_at i
      else
        result << e
      end
    }
    
  • 如何选择 JavaScript 模板? at 2015年01月23日

    用 coffeescript 就可以了

  • 调查下各位看书的情况 at 2015年01月23日

    以前主要看纸书,脖子弯下去成 90 度还累

    现在主要在电脑看电子书,脖子毛病渐渐好了,retina 屏用过就回不去了

    没什么事就看外文的,电子版多,内容较新,用词精确,错漏也少 技术类的外文书都比较好懂,根本不会担心文科类外文书的佶屈聱牙表述...

    让公司买个 safari books online 账号吧,技术书籍基本涵盖


    没有版权意识的穷人,可以去俄国人的网站 libgen 找书...

    最近有些古书找不到,发现可以到新德里图书馆找!那个在线浏览 tiff 一页页的可以爬下来然后再自己组合...

    身为程序员,总是会有亲戚朋友提要求爬百度文库... 正常页是挺难的,phantomjs 都搞不定,不过把 url 的 wenku 改成 wapwenku 就能爬了...

  • :thumbsup: 腻害

  • csv 只要拆成行数不超过 65535 就可以用 excel 打开了,不用格式吧

  • 关于固定格式的文本解析 at 2015年01月19日

    #2 楼 @big_bugs 多长?1GB 以上就用状态机吧

  • 没什么用,一般 Ruby 应用中 99% 瓶颈的地方都被性能更高的语言 -- C 实现的代码占据了,例如 imagemagick 等等

  • [*1..2000].sample 500

  • 关于固定格式的文本解析 at 2015年01月16日

    你得写个 parser, 例如用我的 rsec...

    require "rsec"
    
    module Parser
      include Rsec::Helpers
      extend self
    
      def build_parser
        names = /[^\{\s;]+/.r.join(/[\ \t]+/).even
    
        entry = seq(names, ';'.r | (/\s*/.r >> lazy{block})).map{|(vs, last_v)|
          last_v == ';' ? vs : vs << last_v
        }
    
        block = /\{\s*/.r >> entry.join(/\s*/).even << (/\s*\}/)
    
        entry
      end
    
      def parse src
        @parser ||= build_parser
        @parser.parse! src.strip
      end
    end
    
    if __FILE__ == $PROGRAM_NAME
      require "pp"
      pp Parser.parse DATA.read
    end
    
    __END__
    interfaces {
        ge-1/0/1 {
            description pT:CQ-GYQ-WLD-BAS-2.MAN.ME60-X16.163:1GE::ETH-8/1/2;
            vlan-tagging;
            mtu 9192;
            hold-time up 60000 down 0;
            link-mode full-duplex;
            gigether-options {
                no-auto-negotiation;
            }
            unit 2 {
                vlan-id 2;
                family inet {
                    address 58.43.34.105/30;
                }
            }
            unit 3 {
                vlan-id 3;
                family inet {
                    address 172.1.1.33/30;
                }
            }
        }
    }
    
  • #9 楼 @zyfire Ruby 本身就是封装的 C 写的 md5, 和其他语言实现一样

  • 呃,主要是 Digest::MD5.hexdigest 的实现多生成了一个重量级对象啦,你先 Digest::MD5.new 就好了。下面这个单线程的代码大约 1 分半钟

    #!/usr/bin/ruby
    require 'digest/md5'
    
    M = Digest::MD5.new
    def fexe value=""
        digest = M.hexdigest(value)
        10000.times {
          digest = M.hexdigest(value)
        }
    end
    
    count = 0
    arr = []
    msg = "http://php.net/manual/en/function.printf.php";
    
    10000.times {
      fexe msg
    }
    
    puts "size: #{arr.size}"
    puts "done!"
    
  • #2 楼 @sevk 嗯,它们都 old 了

  • 你要用 prepend 而不是 include

  • C/Java/C# 的 -13/3 = 13/-3 = -4 都是简单的正数除法加个负号

    而 Ruby, Python 和 Perl 都是向负无穷规约,商为 -5, 这个设计的优点是被除数为正的时候能保证余数总是非负的

    (-13).divmod 3 # 商为 -5, 余 2
    

    在数论上一般都是用非负余数

    http://en.wikipedia.org/wiki/Modulo_operation

    Usually, in number theory, the positive remainder is always chosen

    Raymond T. Boute[6] describes the Euclidean definition, which is the one in which the remainder is always positive or 0, and is therefore consistent with the division algorithm

  • List Comprehension in Ruby at 2015年01月12日

    @liqiang 三角形这个例子不错,但是你实现的 list_comprehension 也不支持动态范围的 b, c, 那么这么写

    list_comprehension [*1..100], [*1..100], [*1..100],
      proc{|a, b, c| c**2 + b**2 == a**2 },
      :itself.to_proc
    

    就相当于这么写而已:

    [*1..100].product([*1..100], [*1..100]).select{|a, b, c| c**2 + b**2 == a**2}.map &:itself
    
  • List Comprehension in Ruby at 2015年01月12日

    #6 楼 @liqiang 你说的对... 应该是 product 而不是 zip, 已经改正

    f x, a 在找不到匹配值的时候会返回 nil, 不是永远为真的 (find 在空 ds 或者所有尝试都失败后返回 nil)

    block 里 return 很正常啊,写多了你就习惯了

  • List Comprehension in Ruby at 2015年01月12日

    #4 楼 @kikyous 今天成人节...

  • List Comprehension in Ruby at 2015年01月12日

    list comprehension 就是 filtermap 而已,而且 ruby 也有 divmod 啊...

    def row n
      n...(n+9)
    end
    
    def col n
      (0...9).map{|x| x*9 + n }
    end
    
    def box m, n
      [m, m+1, m+2].product([n, n+1, n+2]).map{|i, j| i*9 + j}
    end
    
    def f x, a
      x -= 1
      return a if x < 0
      return f(x, a) if a[x] != '.'
      a = a.dup
      q, r = x.divmod 9
      ds = ('1'..'9').to_a - a.values_at(*row(q*9), *col(r), *box(q/3*3, r/3*3))
      ds.find {|d| a[x] = d; return r if (r = f x, a) }
    end
    
    r = f 81, "53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79".chars
    puts r.each_slice(9).map(&:join)
    

    还有一行流解数独不过太魔法

  • 二维的多个的...

    [m1, m2, m3, m4, m5].inject do |a, b|
      a.zip(b).map{|x, y| x.zip(y).map &:max }
    end
    
  • 因为 en.wikipedia.org/wiki/Page_fault

  • #1 楼 @huacnlee

    class Abc
      def initialize title: '', flag: ''
        @title = title
        @flag = flag
      end
    end
    
  • 又一个文件上传组件 refile at 2015年01月06日

    #5 楼 @blacktulip 只是我对一些作者的感觉... 先做个东西然后反思然后再做个东西然后再反思...

  • 又一个文件上传组件 refile at 2015年01月06日

    呃,腹泻型选手...