Tag:

Ruby:模块,Mixins和Block令人困惑?

以下是我试图从Ruby Programming Book中运行的代码http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html 为什么product方法没有给出正确的输出? 我用irb test.rb运行它。 我正在运行Ruby 1.9.3p194 。 module Inject def inject(n) each do |value| n = yield(n, value) end n end def sum(initial = 0) inject(initial) { |n, value| n + value } end def product(initial = 1) inject(initial) { |n, value| n * value } end end class Array include Inject end […]

为什么Hash #select和Hash#reject将密钥传递给一元块?

我的理解是Hash#select和Hash#reject每次都会传递一个键数组及其值[key, value]作为每个迭代的单个块参数,你可以使用隐式破坏性赋值直接在块中选择它们: {a: 1, b: 2}.select{|k, v| k == :a} # => {:a => 1} {a: 1, b: 2}.reject{|k, v| v == 1} # => {:b => 2} 或明确的破坏性赋值: {a: 1, b: 2}.select{|(k, v)| k == :a} # => {:a => 1} 我期望,当我传递一个一元块时,整个[key, value]数组将被传递,但实际上,似乎键被传递: {a: 1}.select{|e| pe} # => Prints `:a` (I expected `[:a, 1]`) […]

Ruby do / end vs braces

为什么这个地图表达式会产生不同的结果,具体取决于我是使用大括号还是执行/结束? a = [1,2,3,4,5] p a.map { |n| n*2 } #=> [2,4,6,8,10] p a.map do |n| n*2 end #=> [1,2,3,4,5]

我可以使用Ruby从内部引用lambda吗?

我希望能够使用Ruby从内部调用匿名lambda。 考虑以下递归块(返回阶乘)。 我知道我可以将它分配给变量,并且该变量在lambda的范围内: fac = lambda { |n| n == 1 ? 1 : n * fac.call(n – 1) } fac.call(5) 但是,我希望能够做到以下(因为没有实际原因,我只是对探索语言感兴趣): (lambda { |n| n == 1 ? 1 : n * self.call(n – 1) }).call(5) 我知道那是行不通的,因为self是main对象。 我做错了吗? 我是否尝试做一些不可能的事情 – 如果不是,这是因为某些理论上的限制还是仅仅是在Ruby中没有实现?

@instance_variable在ruby块内不可用?

使用以下代码: def index @q = “” @q = params[:search][:q] if params[:search] q = @q @search = Sunspot.search(User) do keywords q end @users = @search.results end 如果使用@q而不是q,则搜索始终返回空查询(“”)的结果。 为什么是这样? @q变量是否对do … end块不可用?

是否有一个ruby方法只返回一个块的值?

我知道Object#tap ,它接受一个值并返回该值。 但是有一个方法需要一个块并返回块评估的值吗? 为了改进我在这个答案中的代码(这比下面的代码片段更复杂),我想改变 deck.index(“A”).tap {|index| STDERR.puts “Result of indexing for #{“A”.inspect} is #{index.inspect}” } ,有”A”重复,进入 def my_method(*args) yield *args end deck = [‘A’, ‘B’, ‘C’] my_method(“A”) {|value| deck.index(value).tap {|index| STDERR.puts “Result of indexing for #{value.inspect} is #{index.inspect}” } } # Result of indexing for “A” is 0 # => 0

将块传递给方法 – Ruby

我对传球有一点疑问。 def a_method(a, b) a + yield(a, b) end 这很好用。 k = a_method(1, 2) do |x, y| (x + y) * 3 end puts k 但这不起作用。 puts a_method(1, 2) do |x, y| (x + y) * 3 end # LocalJumpError: no block given (yield) 任何人都可以向我解释这个吗? 谢谢。 Paolo Perrotta从Metaprogramming Ruby获取的示例。 好书。

块语法差异导致“LocalJumpError:no block given(yield)”

看到一个奇怪的案例,试图弄清楚这里发生了什么: > def test > p yield > end => nil > test { 1 } 1 => 1 > p test { 1 } 1 1 => 1 > p test do > 1 > end LocalJumpError: no block given (yield)

在块/ lambda中产生麻烦

我有以下Ruby代码: # func1 generates a sequence of items derived from x # func2 does something with the items generated by func1 def test(x, func1, func2) func1.call(x) do | y | func2.call(y) end end func1 = lambda do | x | for i in 1 .. 5 yield x * i end end func2 = lambda […]

Ruby块中奇怪的imoperfection

可能重复: Ruby中这些块编码样式的区别或价值是什么? # This works method :argument do other_method end # This does not method :argument { other_method } 为什么? 似乎解释器很困惑并且认为{…}是哈希。 当解释器无法理解实际有效的代码时,我总是生气。 它类似于PHP,有很多这类问题。