浏览 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

应该写成
(块参数名称可以简单为nameprices

可能是基于“对块参数进行多次分配对初学者来说很难”的考虑,故意将其制作为单个块参数。
我可以理解,但我觉得可能有一些方法,例如分两个阶段呈现模型答案或提供详细解释。
(没看过原著,可能有误会)

示例:使用类和实例概念的代码

根据@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

相关文章: