新手红宝石问题。
我有一个班级
class ReportPage < Page
def badge_item(item_int)
case item_int
when 1..50 then @item= 1
when 50..100 then @item= 50
end
def check_completed_items_badge
badge_item(50)
puts @item
end
end
果然,它没有。这就是我的问题 - 如何在类的另一个方法中使用@item变量?
非常感谢你!
答案 0 :(得分:5)
您错过了end
的{{1}}关键字。这个程序还有另一个问题。 case
包含1到50之间的所有情况,when(1..50)
涵盖50到100,这会引起混淆,因为when(50..100)
将进入第一行,将badge_item(50)
设置为{{ 1}}并退出@item
块。所以最后它会在屏幕上打印1
。
为了更清楚地表达您的意图,您应该使用
case ... end
OR
1
答案 1 :(得分:3)
问题不在于变量赋值,而在于您使用case / when语法。当你给case一个参数时,它使用完全匹配来比较不同的场景。在你的情况下更好的方法可能是使用这样的东西:
def badge_item(item_int)
case
when (1..50).include?(item_int) then @item = 1
when (50..100).include?(item_int) then @item = 50
end
end
修改
Tumtu的更正:
case使用===方法来比较值。即:(1..50)=== 50
答案 2 :(得分:0)
在您的情况下,正确的方法是使用OOP:
class ReportPage < Page
class BadgeItem
def initialize( int )
fail "Badge item integer should be in the range 0..99!" unless 0..99 === int
@int = int
end
def classify
case @int
when 0...50 then 1
when 50..99 then 50
end
end
end
def check_completed_items_badge
badge_item = BadgeItem.new 50
puts badge_item.classify
end
end
答案 3 :(得分:0)
我知道答案已被接受,但我想提出一个关于实例变量如何被抛出的问题的更一般的答案。
直接来自ruby-lang,你会得到以下结果:
Ruby不需要变量声明。它使用简单的命名约定 表示变量的范围。
- var可以是局部变量。
- @var是一个实例变量。
- $ var是一个全局变量。
这些符号通过允许程序员轻松提高可读性 确定每个变量的角色。它也变得没必要了 使用一个无聊的自我。前置于每个实例成员
理解这些不同类型变量之间的区别非常重要。为了做到这一点,我掀起了一个小例子,它可以帮助任何有导航的人在这些行为方面有一个良好的起点。
class Scoping
@unreachable = "but found it. trololol"
$instance = "and found it. swag swag"
def initialize( int )
trial = @unreachable ? @unreachable : " but failed to find."
puts "reaching for the unreachable . . ." + trial
@int = int
end
end
puts $instance
Scoping.new 10
trial = @int ? @int : " but failed to find."
puts "Reaching for instance from class . . ." + trial
trial = $instance ? $instance : " but failed to find."
puts "Reaching for global variable . . ." + trial