Рубин, класс и наследование

Вместо нижней строки

//header("Location:".ADMIN_URL."/index.php");

напишите

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

или

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Это определенно решит вашу проблему. Я столкнулся с одной и той же проблемой, но решил решить эту проблему путем написания заголовка.

3
задан Stefan 18 January 2019 в 10:17
поделиться

3 ответа

Добавление MyArray к MyArray для получения Array может быть нелогичным, но метод может быть определен для возврата любого класса. А в случае Array#+, который вы вызываете, просто определено, что он возвращает Array. Вот и все.

Если вы хотите, чтобы он возвращал MyArray, один из способов сделать это - определить MyArray#+ следующим образом:

class MyArray < Array
  def +other
    MyArray.new(super)
  end
end

(MyArray.new([1, 2, 3]) + MyArray.new([4, 5])).class # => MyArray

Кстати, обратите внимание, что ваше определение MyArray#initialize бессмысленно и, следовательно, излишним.

0
ответ дан sawa 18 January 2019 в 10:17
поделиться

Я не понимаю, почему мой массив "a" не является классом "MyArray" после добавления.

Почему это должно быть (MyArray)? Операция конкатенации для массивов определена так, чтобы возвращать новый Array, так что здесь происходит. https://ruby-doc.org/core-2.5.3/Array.html#method-i-2B

Если вы хотите, вы можете переопределить эту операцию в своем классе, чтобы вернуть экземпляр MyArray. Не забывайте обо всех других подобных методах.

По этой же причине плохая идея создавать подклассы стандартных коллекций. Здесь лучше использовать композицию, а не наследование.

0
ответ дан Sergio Tulentsev 18 January 2019 в 10:17
поделиться

Просто добавить немного к ответу Серхио с точки зрения его комментария об использовании композиции вместо наследования и обмена в комментариях.

Вместо того, чтобы говорить, что MyArray является массивом, вы можете сказать, что MyArrayLike имеет и массив. Затем вы можете «перенаправить» методы, которые имеют смысл, в базовый массив, но при этом добавить собственную функциональность, которая имеет смысл для вашего класса без массива подклассов.

В Ruby даже есть несколько способов сделать это очень легко, включая модуль Forwardable .

class MyArrayLike 
   attr_reader :arr 
   def initialize( initial_arr )
      @arr = initial_arr 
   end

   def +(other)
     result = self.class.new(arr + other.arr)
     # maybe you want to do more than just concat the underlying array, if so you can do it here
     result
   end

   def first
      # for example maybe you want first to just return the first item in the underlying array.
      arr.first 
   end    
end


a = MyArrayLike.new([1,2,3])
b = MyArrayLike.new([4,5])

puts "a.class = #{a.class}"
# => a.class = MyArrayLike
puts a
# => #<MyArrayLike:0x00000000dc4b00>
a += b
puts "a.class = #{a.class}"
# => a.class = MyArrayLike
puts a 
# => #<MyArrayLike:0x00000000dc4470>

puts a.first 
# => 1
puts a.arr 
# => 1
#    2
#    3
#    4
#    5 
0
ответ дан nPn 18 January 2019 в 10:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: