Advertisement
Guest User

Ruby, Safe Reads, Writes

a guest
Aug 19th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.54 KB | None | 0 0
  1. class Module
  2.   def hybrid_accessor(*symbols)
  3.     symbols.each do |symbol|
  4.       variable = :"@#{symbol}"  # :variable => :@variable
  5.       define_method(symbol) do |*arguments|
  6.         return instance_variable_get variable if arguments.empty?
  7.         raise ArgumentError, "Expected 0..1 arguments, got #{arguments.count}" if arguments.count > 1
  8.         instance_variable_set variable, arguments.first
  9.       end
  10.     end
  11.   end
  12.  
  13.   def safe_reader(*symbols)
  14.     symbols.each do |symbol|
  15.       variable = :"@#{symbol}"  # :variable => :@variable
  16.  
  17.       #Borrow a bit from conventions I've seen and say anything appended by
  18.       # an underscore is a "READONLY" field
  19.       define_method("#{symbol}_") do
  20.         return instance_variable_get variable
  21.       end
  22.     end
  23.   end
  24.                            
  25.     # Confusing+unoriginal syntax is confusing+unoriginal
  26.     # Taking suggestions to improve this function
  27.   def safe_writer(*symbols)
  28.     symbols.each do |symbol|
  29.       variable = :"@#{symbol}"  # :variable => :@variable
  30.       define_method("#{symbol}!") { |arg|
  31.         instance_variable_set(variable, arg)
  32.       }
  33.     end
  34.   end
  35. end
  36.  
  37. class X
  38.   safe_reader :test_var
  39.   safe_writer :test_var
  40.   #hybrid_accessor :test_var
  41.  
  42.   def initialize(value = :default)
  43.     puts "RESULT OF ASSIGNMENT: #{test_var! (value)}"
  44.     puts self.methods
  45.    
  46.     read_result = test_var_()
  47.     puts "VALUE OF test_var: #{read_result}\n\t Compare with: #{@test_var}"
  48.     if(read_result != value)
  49.       puts "uhoh"
  50.     end
  51.   end
  52. end
  53.  
  54. x = X.new("Test")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement