为什么这个例子没有红宝石代码打印结果?

时间:2016-02-17 06:57:00

标签: ruby local-variables

我想知道为什么下面的代码不能打印超过3星的电影。

movie_ratings = {
  memento: 3,
  primer: 3.5,
  the_matrix: 5,
  truman_show: 4,
  red_dawn: 1.5,
  skyfall: 4,
  alex_cross: 2,
  uhf: 1,
  lion_king: 3.5
}

def good_movies
  puts movie_ratings.select {|movies, ratings| ratings > 3}
end
good_movies

5 个答案:

答案 0 :(得分:1)

变量movie_ratings不在方法范围内。你应该把它作为参数传递:

movie_ratings = {
  memento: 3,
  primer: 3.5,
  the_matrix: 5,
  truman_show: 4,
  red_dawn: 1.5,
  skyfall: 4,
  alex_cross: 2,
  uhf: 1,
  lion_king: 3.5
}

def good_movies movie_ratings
  puts movie_ratings.select {|movies, ratings| ratings > 3}
end
good_movies movie_ratings
# {:primer=>3.5, :the_matrix=>5, :truman_show=>4, :skyfall=>4, :lion_king=>3.5}

答案 1 :(得分:1)

因为局部变量不能将范围带入方法块。将其更改为另一种类型的变量,例如实例变量,它将起作用。

@movie_ratings = {
  memento: 3,
  primer: 3.5,
  the_matrix: 5,
  truman_show: 4,
  red_dawn: 1.5,
  skyfall: 4,
  alex_cross: 2,
  uhf: 1,
  lion_king: 3.5
}

def good_movies
  puts @movie_ratings.select {|movies, ratings| ratings > 3}
end
good_movies

答案 2 :(得分:1)

方法movie_ratings中无法访问本地变量good_movies。这里有几种方法:

  1. 将评级作为参数传递

    movie_ratings = {
      memento: 3,
      primer: 3.5,
      the_matrix: 5,
      truman_show: 4,
      red_dawn: 1.5,
      skyfall: 4,
      alex_cross: 2,
      uhf: 1,
      lion_king: 3.5
    }
    
    def good_movies(ratings)
      puts ratings.select {|movies, ratings| ratings > 3}
    end
    
    good_movies(movie_ratings)
    
  2. 使评级实例变量(而不是局部变量)

    @movie_ratings = {
      memento: 3,
      primer: 3.5,
      the_matrix: 5,
      truman_show: 4,
      red_dawn: 1.5,
      skyfall: 4,
      alex_cross: 2,
      uhf: 1,
      lion_king: 3.5
    }
    
    def good_movies
      puts @movie_ratings.select {|movies, ratings| ratings > 3}
    end
    
    good_movies
    

答案 3 :(得分:1)

您应该将movie_ratings传递给方法good_movies,如下所示:

def good_movies(movie_ratings)
  puts movie_ratings.select {|movies, ratings| ratings > 3}
end

或使movie_ratings成为像这样的实例变量:

@movie_ratings

然后在方法内使用:puts @movie_ratings.select {|movies, ratings| ratings > 3}

答案 4 :(得分:0)

如果您收到以下错误:

NameError: undefined local variable or method `movie_ratings' for main:Object

原因是方法good_movies创建了自己的本地范围,但它不了解movie_ratings是什么。您需要将其传递给方法,以便该方法能够理解它是什么。

def good_movies(movies)
  return movies.select { |m, r| r > 3 }
end