如果 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 的书都这么讲...
#13 楼 @blacktulip 配合"伸手"的主题...
嗟,来食!
result = []
arr.each{|e|
if i = result.index([e[0], -e[1]])
result.delete_at i
else
result << e
end
}
用 coffeescript 就可以了
以前主要看纸书,脖子弯下去成 90 度还累
现在主要在电脑看电子书,脖子毛病渐渐好了,retina 屏用过就回不去了
没什么事就看外文的,电子版多,内容较新,用词精确,错漏也少 技术类的外文书都比较好懂,根本不会担心文科类外文书的佶屈聱牙表述...
让公司买个 safari books online 账号吧,技术书籍基本涵盖
没有版权意识的穷人,可以去俄国人的网站 libgen 找书...
最近有些古书找不到,发现可以到新德里图书馆找!那个在线浏览 tiff 一页页的可以爬下来然后再自己组合...
身为程序员,总是会有亲戚朋友提要求爬百度文库... 正常页是挺难的,phantomjs 都搞不定,不过把 url 的 wenku 改成 wapwenku 就能爬了...
:thumbsup: 腻害
csv 只要拆成行数不超过 65535 就可以用 excel 打开了,不用格式吧
没什么用,一般 Ruby 应用中 99% 瓶颈的地方都被性能更高的语言 -- C 实现的代码占据了,例如 imagemagick 等等
[*1..2000].sample 500
你得写个 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;
}
}
}
}
呃,主要是 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!"
你要用 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
@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 就是 filter
加 map
而已,而且 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
#5 楼 @blacktulip 只是我对一些作者的感觉... 先做个东西然后反思然后再做个东西然后再反思...
呃,腹泻型选手...