ActiveSupport::MessageVerifier 提供的也是类似的功能。当时看 JWT 怎么看怎么觉得眼熟。
岗位是招 Ruby 工程师,职责是 Python 到 Java 的转换,神秘...
约定。问号表示返回布尔值。在其他语言里约定相对方法名是 #is_adj() / #has_noun() 同理还有感叹号,表示方法对对象自身有副作用
Padrino 最方便的还是天生多 app 的结构。有点类似于 https://ruby-china.org/topics/28538 这贴中拆解的 engine + systems 的结构 不过,padrino 自带的 autoloader 实际用起来总有点不尽如人意的地方...
def add(a,b)
a = a.push(b)
end
x = [1]
y = 2
add(x, y)之后,x变成了
[1,2]
这段代码里改变 a 值的是 a.push(b), 至于后面的 a = 这段,符号是有作用域的。你在函数传参时只传递了引用,并没有将外层的符号传递进来,里面的 a 和外面的 x 并不是同一个符号,只是它们指向相同的对象。你在函数中对符号 a 这个所指向的引用进行了改变,并不会影响原来 a 所指向的对象. 所以第二段也不会影响 x, 因为 a + b 这个操作是不会影响 a 原来所指对象的值的
散列的实现是建立一个大数组 big_array, key 传入固定的 hash 函数算出 hash(key)
值作为 index 索引。把 value 存在 big_array[hash(key)]
这个容器里。你问的这个函数就是在做这件事,分配索引位置。
具体到这函数的实现,它通过 key.hash
算出一个 hash 值。由于这个 hash 值可能比你 aDict 这个容器数组的索引范围大,就再用 %(取余) 来映射。
#8 楼 @small_fish__ 有类似 ruby rack 或者 python wsgi 这样的 interface 吗? 在 awesome-crystal 的收集里似乎没看到
keyword arguments 从 ruby 2 开始就是被推荐的参数表风格. 好处来讲,keyword arguments 更方便的定义长可选参数表。另外在调用的时候也更具有可读性,这一点适合用来做 DSL.
PS: 能尽量避免写 rocket syntax 就尽量避免。既不好看也不简洁。1.9 的风格指导开始就尽量淘汰这种写法。2.2 以后更是支持
{'@a#complex%whatever.long___string__': true}
这种方式写 literal hash. 对于 string 和 symbol 区分不敏感的 kv 对都建议用新字面量定义方式。
salary 是 rand(10000) 真的好吗 233
写 rails-api 的时候用到过 apipie-rails(GitHub) 这个 gem, 参数验证和简单的文档生成都能胜任。
UUID version 5 ActiveSupport 中的实现:Digest::UUID#uuid_v5
#const_get
这个方法本来就不保证命名空间,如果你内存里已经有一个 Post 而没有 API::Entities::Post 的话,#const_get
就不会走 rails 的 auto load, 直接把你内存里的 Post 给取出来了.
如果想保证命名空间的话,最好还是拼字符串 "::API::Entities::#{...}", 然后调用 ActiveSupport 里的 String#constantize
查了一下文档 Module#const_get
, 方法接受两个参数,第一个参数是名字,第二个参数是个布尔值,为 false 的时候就只会在当前 Module 中查询常量,否则会一路在祖先中找下去。
用 Elasticsearch 的话其实可以更简单一些,两个 AR model 分别对应两个 ES 的 document type, 放在同一个 index 下,不需要引入第三个 document type.
Update: 新增两个控制选项
ActiveRecord.where 返回的也是一个 lazy 的查询集,只不过在控制台里显示的时候会被实际执行一下 (同 pp).
RedisStore 和 Sidekiq 都允许手动初始化 redis client, 设置 db. 条件允许的话还是把 db 分开比较好,不然就要记住 sidekiq 用的哪些 key.
这是个正则问题 /^xxx/
或者 /\Axxx/
^是行首,\A是字符串头,根据情况选择
尽量避免用以上两种之外的正则查询,性能堪忧...
开发系统竟然没有 arch 大法
#40 楼 @goody9807 试试 development 模式里在需要调试的地方插 byebug 或者 binding.pry. 抛开 IDE 这个东西吧
#27 楼 @iBcker #28 楼 @jimrokliu 有过一次迁往 sinatra, 当时 json api 的负载加重,从 controller 里分离出来. 操作起来要说能轻松迁移确实是不可能做到,尤其是很多 gem 建立在 rails 的基础之上,为了这些东西能继续工作写了很多奇奇怪怪的 helper. 有些 gem 干脆就换了。前后用了大概两周。其实现在想想当初因为拆分 api 的契机而去把框架换掉也不是很值得,当时并没遇到性能瓶颈. 测试/文档这部分东西确实很重要,最早的时候开发为了快轻视了很多这个,后来发现迭代的时候越来越慢。现在不敢再这么不管了..
#25 楼 @jimrokliu 性能问题不在 ruby 而是在 rails. rails 为了提供最佳实践用了许多 middleware. 不过等增长到需要面对这些性能坑的时候,多半公司已经成长到相当大的规模了。这时候无论是迁移到其他更轻的 ruby 框架还是迁移到其他语言,都已经有能力应付了。
看了看还是有不少题没支持 ruby 的,最后的统计界面也没出 ruby 综合性能最烂的居然是 java...