浏览 Qiita 的新文章,我有时会看到几篇关于处理同一主题的结果的文章。
由于有“模型答案”,我认为他们可能在某种教材上工作。
看到“样板答案”的代码时,经常会歪着头,所以在本文中特意指出。
我介绍的所有内容都是用 Ruby 编写的。
我不能参考原文,因为大部分来源都没有写。
*本文无意批评此类文章或作者。相反,我写的感觉是我想让你振作起来。
*此外,我无意侮辱或批评我收集的材料或其提供者。它可能是不敬的,但如果您可以将其用于改进,我将不胜感激。
另外,根据材料的不同,主题本身可能会很奇怪,但这次我不会再谈了。
这一次,我选择了三个主题。我引用了我能找到的关于每个主题的最新文章。
示例:嵌套 Ruby each
主题是
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
给定表格中的水果价格表
appleの合計金額は670円です
orangeの合計金額は300円です
melonの合計金額は2700円です
并获得输出。
如果你在Qiita上搜索tag:ruby fruits_price,将会有30多篇文章被点击。
模型答案根据@yu-ki87 的文章
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]
fruits_price.each do |fruit|
sum = 0
fruit[1].each do |price|
sum += price
end
puts "#{fruit[0]}の合計金額は#{sum}円です"
end
(我不知道原文,所以请允许我引用文章;下同)。
计算总数
sum = 0
fruit[1].each do |price|
sum += price
end
但是,在Ruby中求一个数组的数值之和就不用写这么麻烦的代码了,
sum = fruit[1].sum
够了。
(即使在引用的文章中,文章作者也使用sum。也许你被模型答案的过度复杂性弄糊涂了)
这可能是很久以前创建材料的时候了。
数组#sum在 2016 年 12 月发布的 Ruby 2.4.0 中引入。它已经快六岁了(在撰写本文时)。
无法使用Array#sum 的 Ruby 2.3 系列的官方支持已于 2019 年 3 月结束。换句话说,3年前它是一个“不使用版本”。
我想这个教材大概是为了习惯each的嵌套,所以如果你使用sum,它就不会嵌套。在这种情况下
apple
200円
250円
220円
orange
100円
120円
80円
melon
1200円
1500円
我觉得将主题显示为很好。
在那之后,
fruits_price.each do |fruit|
end
我在块中使用fruit[0] 和fruit[1],但我不希望初学者模仿这种风格。
有两个块参数
fruits_price.each do |fruit_name, fruit_prices|
end
应该写成
(块参数名称可以简单为name、prices)
可能是基于“对块参数进行多次分配对初学者来说很难”的考虑,故意将其制作为单个块参数。
我可以理解,但我觉得可能有一些方法,例如分两个阶段呈现模型答案或提供详细解释。
(没看过原著,可能有误会)
示例:使用类和实例概念的代码
根据@fujitacoma 的文章,主题是,
class Article
def initialize(author, title, content)
@author = author
@title = title
@content = content
end
end
给定一个名为
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
得到显示。
如果你搜索这个,你会发现很多文章,所以哪里肯定有教材。
一个典型的答案是
class Article
def initialize(author, title, content)
@author = author
@title = title
@content = content
end
def author
@author
end
def title
@title
end
def content
@content
end
end
article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")
puts "著者: #{article.author}"
puts "タイトル: #{article.title}"
puts "本文: #{article.content}"
这是正确的。
三个getter方法(读取实例变量值的方法)是认真定义的,attr_reader如果你使用
attr_reader :author, :title, :content
你只需要
也许我没有这样做的原因是它针对的是“为时过早”的学习者。然后你就可以理解了。
在这一点上,我认为如果有适当的指导会很好(首先学会认真定义,然后学会用attr_reader轻松处理)。
更让我困扰的是,我一个个调用getter方法来得到想要的输出。
这个主题大概是“将文章信息表示为一个对象并显示出来”。
如果您一一称呼作者和标题,我认为使用类没有多大意义。
如果你想创建一个处理文章信息的类,
class Article
def initialize(author, title, content)
@author = author
@title = title
@content = content
end
def show
puts "著者: #{@author}"
puts "タイトル: #{@title}"
puts "本文: #{@content}"
end
end
article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!")
article.show
类不应该有一个负责显示所有信息的方法,比如
示例:输出一个字符串,该字符串将给定字符串的最后两个字符重复 3 次
根据@itosyo4126的文章,题目是
def extra_end(str)
# 処理を記述
end
# 呼び出し例
extra_end('Hello')
,并且似乎显示了lololo。
一个典型的答案是
def extra_end(str)
char_num = str.length
right2 = str.slice(char_num - 2, 2)
puts right2 * 3
end
(在引用的文章中,没有写“模型答案”,但在另一篇文章中将相同的代码列为模型答案)。
字符串#slice虽然这是一个正确使用的例子
def extra_end(str)
right2 = str.slice(-2, 2)
puts right2 * 3
end
不是很好吗?
str.slice(-2, 2) 可以更简洁地写成str[-2, 2],所以
def extra_end(str)
puts str[-2, 2] * 3
end
我认为这很好。
如果有可能将“最后 2 个字符”更改为“最后 3 个字符”,则上述代码有两个更改,
def extra_end(str)
puts str[-2..-1] * 3
end
可能更好。
如果你使用 Ruby 2.6(2018 年 12 月发布;官方支持已经结束)引入的“Range without end”
def extra_end(str)
puts str[-2..] * 3
end
可以写成
String#slice 和它的别名String#[] 有很多用途,对于初学者来说,一次掌握它们肯定是困难的。
但是,我认为如果它以易于理解的用法开始并按顺序进行指导会很好。
综上所述
希望教材不断改进。
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308626988.html