Могу ли я сделать `»#{имя_файла}»` проще?

#ruby #string

#ruby #строка

Вопрос:

Писать что-то как это "#{file_name}" вместо просто file_name выглядит довольно многословно.

   def write_hello(file_name)
    File.open("#{file_name}", "w") { |file| file.puts "Hello, world! I'm Ruby :)"}
  end
  

Что я могу сделать, чтобы сделать его чище?

Обновлено

У меня просто есть соглашения об именовании ruby, поэтому я обновил их fileName до file_name настоящего момента.

Комментарии:

1. Тангенциально, но те же соглашения об именовании хотели бы write_hello вместо writeHello . Держитесь! 😀

2. Да! Спасибо, просто сосредоточился на именах переменных.

3. В следующий раз, когда вы спросите себя «могу ли я сделать x вместо y?» , вам следует просто попробовать 🙂

4. Стефан, извини за глупый вопрос. Я пробовал в IntelliJ 2018.3 , но он выделен и работает странно. Глупо задавать этот вопрос, как кажется сейчас, но в то время это просто сбивало меня с толку. Спасибо за ~ дружеское напоминание ~. Спасибо 😉

5. RubyMine более полезен в этом отношении.

Ответ №1:

Это излишне многословно.

 x = "test"
"#{x}"
# => "test"
  

В вашем случае это буквально то же самое.

Идиоматическая версия этого кода на Ruby выглядит следующим образом:

 def write_hello(filename)
  File.open(filename, "w") do |file|
    file.puts "Hello, world! I'm Ruby :)"
  end
end
  

При этом используется многострочная do ... end форма, которая часто намного проще для отслеживания и понимания, но в остальном эквивалентна { ... } форме. Новички в Ruby могут быть немного озадачены тем, насколько { x: 'y' } и { |x| 'y' } сильно отличаются друг от друга, поэтому это позволяет избежать двусмысленности.

Нет необходимости вводить что-либо изолированно. Это было бы необходимо, если бы вы хотели добавить расширение файла, например:

 File.open("#{filename}.txt", "w") do |file|
  # ...
end
  

Где вы бы назвали это как:

 write_hello(:example)
  

И это создало бы example.txt

Ответ №2:

Ваш код работает, но на самом деле это плохой код. Действительно, это должно быть записано как fileName , хотя Rubyist не назвал бы переменную подобным образом в случае camel.

Однако было бы лучше написать короче, например

 File.write(fileName, "Hello, world! I'm Ruby :)")
  

хотя, как отмечает Стефан, вам пришлось бы явно добавить символ новой строки в конце строки, если вы этого хотите, как отмечает Стефан.

Комментарии:

1. Извините, просто впервые в ruby. По-прежнему понятия не имею, как все работает. Работа с основами все еще продолжается…

2. write не добавляет новую строку (в отличие от puts ).