我正在尝试学习块,但在验证语法后我无法运行以下代码:
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)
答案 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
祝你好运!