如何编写块,与块调用冲突并将参数传递给方法

时间:2014-09-15 16:10:54

标签: ruby

我正在尝试学习块,但在验证语法后我无法运行以下代码:

class Test
  def arthmatic(a=5,b=6)
    yield(a,b)
  end

  arthmatic do |a,b|
    if a > b
      puts "x is greater"
    else 
      puts "y is greater"
    end
  end
end

test.new.arthmatic(6, 7)

3 个答案:

答案 0 :(得分:2)

当你调用它时,你可以在方法中提供块,而不是在类中,所以试试这个:

class Test
  def arthmatic(a=5,b=6)
    yield(a,b)
  end
end

Test.new.arthmatic(6, 7) do |a, b|
  if a > b
    puts "x is greater"
  else 
    puts "y is greater"
  end
end

答案 1 :(得分:0)

我收到了这个错误:

test.rb:7: undefined method `arthmatic' for Test:Class (NoMethodError)

你的语法还可以,但是你试图从错误的范围(测试的类范围)调用关节运动

你需要这样做:

class Test
    def arthmatic(a=5,b=6)
        yield(a,b)
    end

    Test.new.arthmatic {|a,b|

    if a > b

    then
    puts "x is greater"
    else
    puts "y is greater"
end
}
end

Test.new.arthmatic(6, 7) do |a,b|
  puts a,b 
end

或者这个

class Test
    def self.arthmatic(a=5,b=6) # class method
        yield(a,b)
    end

    arthmatic {|a,b|

    if a > b

    then
    puts "x is greater"
    else
    puts "y is greater"
end
}
end

Test.arthmatic(6, 7) do |a,b|
    puts a, b
end

那是关于方法范围的,你忘了在最后一个方法调用中传递块,你需要通过检查方法上的块来修复:


    def self.arthmatic(a=5,b=6) # class method
        yield(a,b) if block_given?
    end

或者总是传递它


Test.arthmatic(6, 7) do |a,b|
    puts a, b
end

答案 2 :(得分:0)

一些想法:

在Ruby中,我们通常不使用if..then ...而是,只是......如果......结束。

if
   do something
else
   do something different
end

此外,代码块(如果多于一行)通常以“do”开头并以“end”结束:

do
  ..something..
end

代码块,如果传递给方法,应作为方法调用的一部分传递,通常在参数之后传递(这取决于设计,有时块将是最后一个参数,但它总是属于方法调用)......

此外,Ruby区分大小写。当你想要Test.new时,你打电话给test.new。

最终代码如下:

class Test
  def arthmatic(a=5,b=6)
    yield(a,b)
  end
end

Test.new.arthmatic(6, 7) do |a,b|
  if a > b
  then 
    puts "x is greater"
 else 
    puts "y is greater"
  end
end
祝你好运!