如何在Ruby中的方法之间传递变量?

时间:2011-09-28 06:27:47

标签: ruby

新手红宝石问题。

我有一个班级

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变量?

非常感谢你!

4 个答案:

答案 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