• 嗯,在打理一下可以发个feature request看看他们喜不喜欢

  • 👍

  • 是的

  • Ruby 2.6 无限 Range at 2018年04月26日

    要说的话ary[1..-1]其实是个很神奇的思路,直接把begin和end拿来用了,1..-1和1..Infinity看上去是完全不等价的两个东西……

  • 非常赞,ssr和webpacker结合在我看来是完美的方案,可以避开前端各种状态管理,路由的坑。之前看webpacker的react ssr好像有人在WIP,原来react-rails就已经支持了。

  • cichol#live.cn 两个 古银 古金

  • 这样是可解的,就是得用户打密码登录,另外苹果的ITP把google sign in都搞的不能用了。。https://github.com/google/google-api-javascript-client/issues/342

  • 是的,用缓存的话等过期就好,读取和preload会更新缓存,不用手动

  • 这些是可以的:

    router = Mrouter.new
    router.add_route '(/page/:page)(/per_page/:per_page)', '233'
    
    p router.match '' # => {:tag=>"233"}
    p router.match '/page' # => false
    p router.match '/page/12' # => {:page=>"12", :tag=>"233"}
    p router.match '/per_page/12' # => {:per_page=>"12", :tag=>"233"}
    p router.match '/page/12/per_page/34' # => {:page=>"12", :per_page=>"34", :tag=>"233"}
    

    我在遇到 ( 的时候直接让trie分叉了,然后匹配的时候是深度优先匹的。这样做可能trie重复的部分多一点,不过匹配是没问题的。

  • 是指匹配不到 /per_page/34/page/12
    这个可能得反过来加个定义,毕竟定义本身也没表达出可以反过来,别的应该还好吧

  • 是的,不得不用啊。。手机和pc一定要相同的url,就是读session也得用mruby了。。感觉很头疼

  • #2楼 @windwiny 看来确实是,以前binary和普通读混用没注意这点。。 啊,兜了好大的圈子

  • 好吧,我解决了

    def process obj
      case obj
      when String
        obj.chars.map{|x| x.ord}.join('.')
      when Array
        obj.map{|x| process x}
      when Hash
        new_hash = {}
        obj.each do |k,v|
          new_hash[process k] = process v
        end
        new_hash
      else obj
      end
    end
    
    def recover obj
      case obj
      when String
        obj.split('.').map{|x| x.to_i.chr(Encoding.find('utf-8'))}.join
      when Array
        obj.map{|x| recover x}
      when Hash
        new_hash = {}
        obj.each do |k,v|
          new_hash[recover k] = recover v
        end
        new_hash
      else obj
      end
    end
    

    dump之前process load之后recover

    本质是把字符串改成数字的字符串,虽然应该也会有隐患,但是目前看来还没有问题

    这BUG真是太坑爹,5个小时就这么没了

  • Ruby 数组只是一种方法? at 2015年09月19日

    数组还真是一个方法

    array = lambda{|x| x+1}
    p array[0]  #=> 1
    

    以上是声明一个自然数数组

  • #8楼 @coooldfarmer 推特才叫恶心。。根本没有翻页

  • #3楼 @crazyjin 还真不知道,phoneix我以为和rails差不多的,不过volt已经很棒了

  • #1楼 @rei /.\

  • 我觉得我还是很能理解lz的感受的,虽然理解并没有什么用

    不过拼了却没什么回报的例子是比比皆是的,一神带四腿翻不了盘就是翻不了盘,单纯是运气不好也不奇怪,毕竟人的一生是抗争的一生

  • 因为Ruby没办法监听local_variable的赋值行为,所以原则上是无解的

    但是有一些黑科技。。 打个比方你可以分析源代码里对这个函数的调用,把参数拿出来

    var1 = 1
    
    def func(params)
      line_num = caller[0].match(/#{$0}:(\d+):/)[1].to_i
      param_name = File.open($0).readlines[line_num-1].match(/func\((.+)\)/)[1]
    end
    
    p func(var1)  # => "var1"
    

    大概就是这样,其实取参数用这个正则肯定不行。。但是我不会写正则,就糊弄一下


    还有一种方法是看参数的object_id或地址,因为Ruby传参都是传引用 比对一下local_variables的object_id就好了,但是在方法内拿外面的binding是很麻烦的。。而且有同值不同变量名的话也会GG

    也举一个例子

    var1 = 1
    
    $bindings = {}
    set_trace_func proc{|*e| $bindings[e[2]] = e[4] if e[0] == "line"}
    
    def func(params)
      line_num = caller[0].match(/#{$0}:(\d+):/)[1].to_i
      params_binding = $bindings[line_num]
      param_name = params_binding.eval("local_variables").first{|x| params_binding.eval("#{x}.object_id") == params.object_id }
    end
    
    p func(var1)  # => :var1
    

    不过这种不可控的set_trace_func会严重拖慢程序的执行

  • #21楼 @douxiance

    require 'ripper'
    require 'pp'
    
    def test=(n)
      2
    end
    
    code1 = "self.test=1"
    code2 = "self.send(:test=, 1)"
    
    p eval code1 # =是assign,返回值永远是用于assign的值
    p eval code2 # send是方法调用,调用test=方法,返回值就是这个方法的返回值
    
    # 两段代码解析后的语法树,详见《Ruby Under A Microscope》
    pp Ripper.sexp(code1)
    pp Ripper.sexp(code2)
    
  • #3楼 @martin91 印象中send是不走assign的,assign的返回值必定是assign的值 但send的返回值是那个函数的返回值

  • #2楼 @ziu =属于assign,确实是特殊的,和普通私有方法不同

    require 'ripper'
    require 'pp'
    
    def test= n
      puts 1
    end
    
    def test n
      puts 2
    end
    
    private :test=, :test
    
    code =<<EOF
    self.test= 12
    self.test 15
    EOF
    
    pp Ripper::sexp(code)
    
    [:program,
     [[:assign,
       [:field,
        [:var_ref, [:@kw, "self", [1, 0]]],
        :".",
        [:@ident, "test", [1, 5]]],
       [:@int, "12", [1, 11]]],
      [:command_call,
       [:var_ref, [:@kw, "self", [2, 0]]],
       :".",
       [:@ident, "test", [2, 5]],
       [:args_add_block, [[:@int, "15", [2, 10]]], false]]]]
    

    test= 解析出来的操作是把参数assign给对象的属性

    私有方法为=结尾,如果不显式调用,就和局部变量赋值产生歧义,所以只有对象的属性能自定义assign的方法

    关于ruby比较底层的机制,推荐书籍Ruby Under A Microscope,很快有中文版【貌似

  • 什么是性别歧视 at 2015年08月11日

    没有客观共识的辩论毫无意义。。 其实就算法律也不过是强制性的道德,道德来源于大多数人的观点,如果大多数人认为存在歧视,那它也会渐渐变成法律,或者呈现无形的约束力

    人本来就是主观的,有的敏感有的不敏感,只能说换个角度想法会不一样

  • 完全不觉得有歧视,有些人真是想得太多,有点莫名其妙

  • Ruby scan 方法的一个疑问 at 2015年07月31日

    当时没留意这个问题。。惭愧

    不过用set_trace_func和disasm去看调用的过程,并没有发现哪里节省了,scan是生成了数组并推回栈里再调用的each,调用次数是后者更多啊