为什么此示例 ruby 代码不打印结果?
Why doesn't this example ruby code print the result?
我想知道为什么下面的代码不打印超过 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
变量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}
因为局部变量不能将作用域带入方法块。换成另一种类型的变量,比如实例变量,就可以了。
@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
在方法 good_movies
中无法访问局部变量 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(ratings)
puts ratings.select {|movies, ratings| ratings > 3}
end
good_movies(movie_ratings)
创建 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
puts @movie_ratings.select {|movies, ratings| ratings > 3}
end
good_movies
如果您遇到以下错误:
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
您应该像这样将 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}
我想知道为什么下面的代码不打印超过 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
变量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}
因为局部变量不能将作用域带入方法块。换成另一种类型的变量,比如实例变量,就可以了。
@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
在方法 good_movies
中无法访问局部变量 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(ratings) puts ratings.select {|movies, ratings| ratings > 3} end good_movies(movie_ratings)
创建 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 puts @movie_ratings.select {|movies, ratings| ratings > 3} end good_movies
如果您遇到以下错误:
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
您应该像这样将 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}