Светлозар обнови решението на 04.11.2014 02:18 (преди около 10 години)
+def converter(data_type, data)
+ case data_type
+ when 'symbol' then data = data.to_sym
+ when 'number' then data = data.to_numeric
+ when 'boolean' then data = data.to_bool
+ end
+ data
+end
+
+class String
+ def to_numeric
+ if self == self.to_i.to_s
+ self.to_i
+ else
+ self.to_f
+ end
+ end
+
+ def to_bool
+ self.downcase == 'true' ? true : false
+ end
+end
+
+module RBFS
+ attr_accessor :data
+ attr_reader :data_type
+
+ class File
+ def self.parse(string_data)
+ info = string_data.split(':')
+ data = converter(info[0], info[1])
+ file = RBFS::File.new(data)
+ end
+
+ def initialize(*data)
+ @data = data[0]
+ end
+
+ def data
+ @data
+ end
+
+ def data=(new_data)
+ @data = new_data
+ end
+
+ def data_type
+ case @data.class.to_s
+ when 'Fixnum', 'Bignum', 'Float' then :number
+ when 'NilClass' then :nil
+ when 'String' then :string
+ when 'Symbol' then :symbol
+ when 'TrueClass', 'FalseClass' then :boolean
+ end
+ end
+
+ def serialize
+ "#{data_type}:#{data}"
+ end
+ end
+
+ class Directory
+ attr_reader :files
+ attr_reader :directories
+
+ def initialize
+ @files = {}
+ @directories = {}
+ end
+
+ def add_file(name, file)
+ @files[name] = file unless name.include? ':'
+ end
+
+ def add_directory(name, *directory)
+ @directories[name] = directory[0] unless name.include? ':'
+ end
+
+ def [](name)
+ # code
+ end
+
+ def serialize
+ # code
+ end
+
+ def self.parse(string_data)
+ # code
+ end
+
+ def files
+ @files
+ end
+
+ def directories
+ @directories
+ end
+ end
+end
Привет!
Стигнах дотук днес. Дали ще може да почерпя малко конструктивна критика за следните неща и всичко останало?
- В метод data_type: мисля, че сме го споменавали и преди, но добра ли е идеята да се проверяват имената на класовете като стрингове? Или е по-хитро да се измисли нещо с is_a??
- Да мисля ли за по-подходящ начин за инициализация на файлове и директории? (така с взимане само на първия елемент от сплатнатия аргумент ми изглежда твърде лесно, чак граничещо с хак)
- Нещо в именуването, което се случва в self.parse не ми изглежда наред... Чудех се дали да не присвоя на две отделни променливи двата елемента на колекцията info, но така ми се получава повторение на string_data.split(':'). Да си мисля ли за нещо по-добро?
- Това в to_bool хубавият и предпочитан начин за използване на тернарен оператор ли е? (винаги тъй грешно го ползвам... )
Благодаря предварително!
Привет :)
Може, разбира се:
-
Не е добра идея :) Тук малко си се престарал.
case
може да проверява директно, без допълнителни методи, класа на някой обект:case object when String then ... when Symbol then ... ... end
Това е следствие от факта, че
case
сравнява с===
. Изглежда ми странно. Като видя нещо такова и се чудя защо не се подава конкретното нещо, където се вика
new
. По-подходящият начин е просто да го направиш един аргумент наinitialize
и да викашnew
с него там, където го използваш.- Така е, трудно е да именуваш масив от две смислово отделени неща. Затова може да ги "разпакетираш" при присвояването - да станат две променливи, вместо
info[0]
иinfo[1]
. - Не го нацели, съжалявам. :) Както би казал Станислав, това може да се напише и като
downcase == 'true' ? true ? true ? true : false : false ? true : false : false ? true : false
, но е по-добре да е простоdowncase == 'true'
. То самото връща булева стойност.
Малко други неща:
- Когато ти потрябва помощен метод не го дефинирай глобално, а си го сложи като
private
в класа, в който го използваш. Името му също е малко странно. -
to_numeric
всъщност не ти е нужен - Няма нужда да проверяваш дали името съдържа
:
. Няма да ви подаваме невалидни аргументи, пък и ако трябваше да има тази проверка би било по-добре да се хвърли изключение, не да се "премълчава".